Go語言的併發簡單總結

Goexit結束當前goroutine,會調用defer, 不會產生panic
1.6.扇入扇出 fan in\fan out

1.7 通知退出機制
通知退出機制是學習使用context庫的基礎

Lable:
for{
	select {
	case ch<-rand.Int():
	case <-done:
		break Lable
	}
}

2.併發範式
2.1 生成器
2.2 管道
輸入輸出都是chan的時候,鏈式調用
2.3 每個請求一個goroutine
使用waitgroup同步處理過程,結束後統一處理結果,結果處理完使用close通道告訴後面range通道結束獲取到完整結果。

工作通道讀出來就go走,讀到多少個數據就創建多少個協程,容易爆炸。
可以控制最大數量,弄一個有緩衝的channel,新建一個協程寫入一個,表示佔空,處理完再讀出來,表示用完了挪開。問題是協程會一直創建銷燬。
2.4 固定worker工作池
分出n個協程來一起讀通道,讀到就操作,操作完了再讀。工作池是固定的,沒有數據時就會有n個佔用的通道等待讀取。

2.5 future模式
一個流程需要多個子調用,且這些子調用相互沒有依賴。
新建一個協程用來讀取任務、處理任務並返回任務,主線只需要把任務放進去,在需要的時候讀取出來,不影響總進度。也是佔坑方式。

3.context
設計目的:
1.退出通知機制 主要目的
2.傳遞數據 額外功能,因爲傳遞的都是interface{},編譯器不能進行嚴格的類型校驗。
應該傳遞的消息:
日誌信息、調試信息、不影響業務的可選數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章