golang學習 channle詳解

2021-09-19 01:31:29 字數 974 閱讀 9789

下面僅作留存

在goroutine執行的過程中, 有時候需要對資源進行等待, channel就是最典型的資源.

channel的資料定義在這裡, 其中關鍵的成員如下:

傳送資料到channel實際呼叫的是runtime.chansend1函式, chansend1函式呼叫了chansend函式, 流程是:

從傳送者拿到資料並喚醒了g後, 就可以從chansend返回了

判斷是否可以把元素放到緩衝區中

無緩衝區或緩衝區已經寫滿, 傳送者的g需要等待

從這裡恢復表示已經成功傳送或者channel已關閉

從channel接收資料實際呼叫的是runtime.chanrecv1函式, chanrecv1函式呼叫了chanrecv函式, 流程是:

複製後呼叫goready恢復接收者的g, 處理同上

把資料交給接收者並喚醒了g後, 就可以從chanrecv返回了

判斷是否可以從緩衝區獲取元素

無緩衝區或緩衝區無元素, 接收者的g需要等待

從這裡恢復表示已經成功接收或者channel已關閉

關閉channel實際呼叫的是closechan函式, 流程是:

可以看到如果g需要等待資源時,

會記錄g的執行狀態到g.sched, 然後把狀態改為等待中(_gwaiting), 再讓當前的m繼續執行其他g.

等待中的g儲存在**, 什麼時候恢復是等待的資源決定的, 上面對channel的等待會讓g放到channel中的鍊錶.

對網路資源的等待可以看netpoll相關的處理, netpoll在不同系統中的處理都不一樣, 有興趣的可以自己看看.

legendtkl很早就已經開始寫golang內部實現相關的文章了, 他的文章很有參考價值, 建議同時閱讀他寫的內容.

morsmachine寫的針對協程的分析也建議參考.

golang中的協程實現非常的清晰, 在這裡要再次佩服google工程師的功力, 可以寫出這樣簡單易懂的**不容易.

Golang學習 基礎

一 helloworld 首先是helloworld package main import fmt func main 編譯和執行 go buid hello.go hello 二 變數,常量 1.定義乙個變數 var a int var b int 10 c 10 等價於var c int 10...

Golang學習筆記

如果乙個method的receiver是 t,你可以在乙個t型別的例項變數v上面呼叫這個method,而不需要 v去呼叫這個method 即不需要 v method 如果乙個method的receiver是t,你可以在乙個 t型別的變數p上呼叫這個method,而不需要 p去呼叫這個method。i...

golang學習筆記

與c語法不同之處 1.引數列表中各個引數型別相同時可以只寫出最後乙個,如 add x,y int int 2.型別在引數名 變數 函式 後面 3.函式的左大括號要跟函式名同一行,否則編譯不過 4.函式定義要先寫關鍵字func在函式開頭 函式外的每個語句都要以func var等等關鍵字開頭 5.在包或...