Goroutines
Go 語言並發基礎:Goroutines 與排程器。
Goroutine 概念
- 同步執行
- 匿名函式的 goroutine
- 使用 WaitGroup 進行更穩健的控制
- 輕量級的應用層級執行緒,有獨立的執行流程
- 有自己的排程器,將 goroutines 多工於 OS 層級的執行緒上
- 將任意數量的 goroutines 排程到任意數量的 OS Threads(m:n 多路復用)
- 透過 Channels 通訊
Runtime Scheduler

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)

Context Switching
切換發生於:
- Function Call
- Garbage Collection
- Network Calls
- Channel Operations
- 使用
go關鍵字時
Goroutine Leak
清理 Goroutines 的重要性
- 每當啟動一個 goroutine,必須確保它最終會結束
- 永遠不會終止的 goroutine 會永久佔用其保留的記憶體,稱為
goroutine leak - 若 goroutine 永遠阻塞在 I/O(如 channel 通訊)或陷入無限迴圈,就會發生洩漏
與 OS Threads 比較
| Goroutine | OS Threads |
|---|---|
| Green Thread | 由核心管理 |
| 實際執行緒的抽象 | 依賴硬體 |
| 由 Go runtime 管理 | 執行緒成本較高 |
| 可執行數百萬個而不影響效能 | 啟動時間較長 |
Stateful Goroutines
維護狀態的 goroutines 模式。