Golang併發 一招掌握無阻塞通道讀寫

2021-09-05 12:09:09 字數 2329 閱讀 5589

介紹golang併發的模型寫了幾篇了,但一直沒有以channel為主題進行介紹,今天就給大家聊一聊channel,channel的基本使用非常簡單,想必大家都已了解,所以直接來個高階點的:介紹channel的阻塞情況,以及給你乙個必殺技,立馬解決阻塞問題,實用性高

無論是有快取通道、無緩衝通道都存在阻塞的情況。阻塞場景共4個,有快取和無緩衝各2個。

無緩衝通道的特點是,傳送的資料需要被讀取後,傳送才會完成,它阻塞場景

通道中無資料,但執行讀通道。

通道中無資料,向通道寫資料,但無協程讀取。

// 場景1

func readnodatafromnobufch()

// 場景2

func writenobufch()

注:示例**中的output注釋代表函式的執行結果,每乙個函式都由於阻塞在通道操作而無法繼續向下執行,最後報了死鎖錯誤。

有快取通道的特點是,有快取時可以向通道中寫入資料後直接返回,快取中有資料時可以從通道中讀到資料直接返回,這時有快取通道是不會阻塞的,它阻塞場景是

通道的快取無資料,但執行讀通道。

通道的快取已經佔滿,向通道寫資料,但無協程讀。

// 場景1

func readnodatafrombufch()

// 場景2

func writebufchbutfull()

golang併發模型:輕鬆入門select

golang併發模型:select高階

下面示例**是使用select修改後的無緩衝通道和有緩衝通道的讀寫,以下函式可以直接通過main函式呼叫,其中的ouput的注釋是執行結果,從結果能看出,在通道不可讀或者不可寫的時候,不再阻塞等待,而是直接返回。

// 無緩衝通道讀

func readnodatafromnobufchwithselect() else

// output:

// channel has no data

}// 有緩衝通道讀

func readnodatafrombufchwithselect() else

// output:

// channel has no data

}// select結構實現通道讀

func readwithselect(ch chan int) (x int, err error)

}// 無緩衝通道寫

func writenobufchwithselect() else

// output:

// channel blocked, can not write

}// 有緩衝通道寫

func writebufchbutfullwithselect() else

// output:

// channel blocked, can not write

}// select結構實現通道寫

func writechwithselect(ch chan int) error

}

使用default實現的無阻塞通道阻塞有乙個缺陷:當通道不可讀或寫的時候,會即可返回。實際場景,更多的需求是,我們希望嘗試讀一會資料,或者嘗試寫一會資料,如果實在沒法讀寫再返回,程式繼續做其它的事情。

使用定時器替代default可以解決這個問題,給通道增加讀寫資料的容忍時間,如果500ms內無法讀寫,就即刻返回。示例**修改一下會是這樣:

func readwithselect(ch chan int) (x int, err error) 

}func writechwithselect(ch chan int) error

}

結果就會變成超時返回:

read time out

write time out

read time out

write time out

本文所有示例原始碼,及歷史文章、**都儲存在github:

使用select的default語句,在channel不可讀寫時,即可返回

使用select+定時器,在超時時間內,channel不可讀寫,則返回

希望這篇文章對你的channel讀寫有所啟發。

一招教你無阻塞讀寫Golang channel

無論是無緩衝通道,還是有緩衝通道,都存在阻塞的情況,教你一招再也不遇到channel阻塞的問題。這篇文章會介紹,哪些情況會存在阻塞,以及如何使用select解決阻塞。阻塞場景 阻塞場景共4個,有快取和無緩衝各2個。無緩衝通道的特點是,傳送的資料需要被讀取後,傳送才會完成,它阻塞場景 通道中無資料,但...

每日一招 熟練掌握變盤方向

字型 大 小換膚 收藏2015 05 21 11 00 03 變盤的結局究竟是向上突破還是破位下行,則取決於多種市場因素,其中主要的有以下四種 1 股指所處位置的高低 2 在出現變盤預兆特徵以前是 的還是 的。是因為 發展到強弩之末出現多空平衡,還是因為 發展到做空動能衰竭而產生的平衡,中的平衡要觀...

輕鬆一招 搞定微信朋友圈推廣

2014年什麼最火?相信大家第一時間想到的就是微商和自 吧 確實在2014年裡微商和自 最火,大家談論得最多的也是這兩類。今天自 我就不談了,我來跟大家談談微商。分享一招在微信朋友圈推廣的方法。夥伴們大菜來了,速度做好準備享用吧 我們知道在做qq空間營銷時需要購買黃鑽,這樣我們可以新增乙個簽名檔,而...