協程通訊之認識channel 阻塞

2021-09-24 08:33:58 字數 849 閱讀 4184

這是go裡面的核心資料型別,有了它我們可以方便的進行協程間資料通訊。其原理**於csp模型理論,go實現了部分理論。

簡單說,csp模型由併發執行的實體(如程序或執行緒)組成,實體之間通過發訊息進行通訊,其中channel承擔了實體和實體之間傳送訊息的通道。

在go裡面goroutine就是實體,它裡面也有個channel來完成通訊。

// 定義乙個函式

func

sum(num int

, c chan

int)

func

main()

這就是乙個最簡單的主線程main和協程sum之間的通訊。

上面的**中

對於傳送者:如果沒有接收者讀取channel,則傳送者會一直阻塞。

同樣對於接收者:接收操作是阻塞的知道傳送者傳送資料。

根據上面的特性,就能實現當goroutine執行完成後得到資料。

func

main()

這就是乙個會阻塞的**。

c :=

make

(chan

int,

2)

這就好比建立了乙個帶有容量=2的channel(好比佇列),只有當佇列塞滿時傳送者會阻塞,佇列清空時接受著會阻塞。

// 定義乙個函式

func

sum(num int

, c chan

int)

func

main()

channel 協程同步

與主協程協同 feedadchan make chan struct 1 var feedad model.advertisement if req.withfeedad 釋放主協程 feedadchan struct 主程式 if req.withfeedad case time.after 2 ...

swoole之協程channel元素個數

channel用於程序內跨協程通訊,按照角色分為生產協程和消費協程。生產協程,在channel已滿時,會被掛起 消費協程,在channel為空是,也會被掛起。chan new swoole coroutine channel 50 function t4 swoole coroutine chann...

協程的認識

協程相比執行緒切換操作不耗費資源,執行緒的切換需要儲存和恢復上下文,並且每個執行緒都有自己的cache快取,比較好效能 執行緒切換導致 碎片化,每次都要判斷是否要切換,協程只需要把所有的操作弄到一起,有乙個耗時操作就切換到下乙個操作繼續執行 執行緒的問題在於他不會主動觸發排程器,尤其是cpu密集型的...