go原始碼分析 channel

2021-09-22 22:39:48 字數 1059 閱讀 3493

1:傳送者流程

1:常規檢查(傳送乙個已經關閉的chan會直接觸發panic)

2:檢視接受則阻塞佇列中是否有sudog(對應的乙個goroutine,注意是dequeue操作),如果有則直接傳送訊息到阻塞的goroutine(gp.param = unsafe.pointer(sg),直接進行指標賦值,具體見chan.go/send函式),並且喚醒接受goroutine,goto 6

3:如果當前的阻塞佇列沒有滿(sudog數量),則直接將傳送的資料寫入到傳送的佇列上(追加寫),goto 6

4:當前的的阻塞佇列滿了(緩衝的數量在此處對於等待佇列中goroutine的數量),生成乙個sudog,將當前的goroutine加入的傳送者佇列中,阻塞當前goroutine,直接有消費者消費完訊息

5:阻塞結束,釋放當前的sudog

6:over

2:接受者流程

1:常規檢查(接收乙個已經關閉的chan會直接return)

2:檢視接受則阻塞佇列中是否有sudog(對應的乙個goroutine),如果有則直接接受訊息對於sudog的訊息,goto 6

3:檢查緩衝佇列中是否有資料,有就直接取 goto 6; 否則繼續

4:(進入阻塞,條件是1:傳送佇列中沒有sudog,2:緩衝區沒有資料)將當前sudog加入接受等待佇列中,並阻塞當前goroutine(呼叫goparkunlock)

5:阻塞結束,釋放當前的sudog

6:over

3:channel關閉流程

1:常規檢查

2:遍歷傳送者/接受者佇列中阻塞sudog,清空elem

3:喚醒對於sudog對於的goroutine

//sudog解釋:

//乙個sudog對應的乙個傳送/接受訊息的goroutine

type sudog struct

ps:至於有緩衝和無緩衝(緩衝區0)的區別,直接套流程就知道區別了。

ps:原始碼位置go/src/runtime/chan.go

Go原始碼分析系列 sql驅動載入

對於開發人員來說,程式語言或是框架都只是工具,重要的是我們的思維方式,所以,我們有些東西,我們不僅要會用,更要知曉其原理和本質。話不多說,進入正題 服務端開發,少不了資料庫操作,就從最基礎的開始,那就先說一下go語言中提供的乙個sql框架 database sql 這個框架很輕量,輕量到只提供了乙個...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

Go併發控制 channel

雖然上次提過的sync控制併發很簡單,但是他有一定的侷限性,他也只能控制能過讓所有的goroutine在程式結束時完成,並不能干涉各個goroutine,下面我們介紹一種更好的方式,就是利用通道 首先先說用channel控制併發在程式結束之前完成 func main ch sum fmt.print...