Goroutines

Go 語言並發基礎:Goroutines 與排程器。

Goroutine 概念

  1. 同步執行
  2. 匿名函式的 goroutine
  3. 使用 WaitGroup 進行更穩健的控制
  4. 輕量級的應用層級執行緒,有獨立的執行流程
  5. 有自己的排程器,將 goroutines 多工於 OS 層級的執行緒上
  6. 將任意數量的 goroutines 排程到任意數量的 OS Threads(m:n 多路復用)
  7. 透過 Channels 通訊

Runtime Scheduler

Go Runtime Scheduler Kernel
  • runtime.NumCPU:取得邏輯處理器數量
  • Logical cores = 實體核心數 × 每核心可執行的硬體執行緒數
  • Go Scheduler 從 GRQ 分配 goroutine 到任意 OS thread 的 LRQ
    • LRQ:Local Run Queue
    • GRQ:Global Run Queue

Go Scheduler 特性

  • 合作式排程器(non-preemptive 非搶佔式)
  • 程序必須定期自願讓出控制權,或在資源上邏輯阻塞時讓出
  • 有特定檢查點讓 goroutine 可以讓出執行權給其他 goroutine(Context Switching)
Go Runtime Scheduler

Context Switching

切換發生於:

  • Function Call
  • Garbage Collection
  • Network Calls
  • Channel Operations
  • 使用 go 關鍵字時

Goroutine Leak

清理 Goroutines 的重要性

  • 每當啟動一個 goroutine,必須確保它最終會結束
  • 永遠不會終止的 goroutine 會永久佔用其保留的記憶體,稱為 goroutine leak
  • 若 goroutine 永遠阻塞在 I/O(如 channel 通訊)或陷入無限迴圈,就會發生洩漏

與 OS Threads 比較

GoroutineOS Threads
Green Thread由核心管理
實際執行緒的抽象依賴硬體
由 Go runtime 管理執行緒成本較高
可執行數百萬個而不影響效能啟動時間較長

Stateful Goroutines

維護狀態的 goroutines 模式。

相關主題