goroutine
-
特點
- 並行程式設計,Go語言層面支援
- goroutine 比執行緒更小,比thread更易用,高效,輕便
- Go語言內部實現了goroutine之間的記憶體共享
- goroutine 是透過 Go 的 runtime 管理的一個執行緒管理器
- 不透過共享來通訊,而透過通訊來共享。
-
channels
- 同goroutine 執行在相同的地址空間
- 阻塞,也就是如果讀取(value := <-ch)它將會被阻塞,直到有資料接收
-
預設情況下,channel 接收和傳送資料都是阻塞的,不需要顯式的 lock (其內部已經處理了各種鎖)
ch <- v // 傳送 v 到 channel ch. v := <-ch // 從 ch 中接收資料,並賦值給v
-
Buffered Channels
- go 允許指定channel緩衝大小,即channel可儲存的元素
- 在有緩衝的情況下,緩衝數之下,元素可以無阻塞寫入通道,超過程式碼會阻塞,直到有其它goroutine從channel中讀取一些元素,讓出空間
-
Range 和 Close
- for i := range c 能夠不斷的讀取 channel 裡面的資料,直到該 channel 被顯式的close關閉
- v,ok := <-ch 測試channel是否被關閉
- 在生產者的地方關閉 channel
-
多個channel
- select 預設阻塞,監聽channel,隨機選擇一個執行
-
超時
- 避免整個程式進入阻塞,用 select 監聽來設定超時
執行時 goroutime
指令/常量 | 說明 |
---|---|
Goexit | 退出當前執行的 goroutine,但是 defer 函式還會繼續呼叫 |
Gosched | 讓出當前 goroutine 的執行許可權,排程器安排其他等待的任務執行,並在下次某個時候從該位置恢復執行 |
NumCPU | 返回 CPU 核數量 |
NumGoroutine | 返回正在執行和排隊的任務總數 |
GOMAXPROCS | 用來設定可以平行計算的 CPU 核數的最大值,並返回之前的值。 |
併發分析
- 競態條件分析工具
- 表現 讀寫不一致, 對同一資源讀寫,程式底層是分步進行
-race
引數 開啟執行時(runtime)對競態問題的分析
- 編譯分析
- 普通的
go run/build
對編譯器進行了最佳化
- 普通的
- 概念
- 競態分析
- 編譯器最佳化
sechudler,M,P,G
本作品採用《CC 協議》,轉載必須註明作者和本文連結