Go 筆記之併發

pardon110發表於2019-10-26

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 協議》,轉載必須註明作者和本文連結

相關文章