Goroutines
Go 言語の並行処理基礎:Goroutine とスケジューラ。
Goroutine 概念
- 同期実行
- 無名関数の goroutine
- WaitGroup を使ったより堅牢な制御
- 軽量なアプリケーションレベルのスレッド、独立した実行フローを持つ
- 独自のスケジューラを持ち、goroutine を OS レベルのスレッドに多重化
- 任意の数の goroutine を任意の数の OS Thread にスケジュール(m:n 多重化)
- Channel で通信
Runtime Scheduler

runtime.NumCPU:論理プロセッサ数を取得- Logical cores = 物理コア数 × 各コアで実行可能なハードウェアスレッド数
- Go Scheduler は GRQ から任意の OS thread の LRQ に goroutine を割り当てる
- 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
Goroutine クリーンアップの重要性
- goroutine を起動する際は、必ず最終的に終了することを確認する
- 終了しない goroutine は予約したメモリを永久に占有する。これを
goroutine leakと呼ぶ - goroutine が I/O(channel 通信など)で永遠にブロックされたり、無限ループに陥ったりするとリークが発生
OS Threads との比較
| Goroutine | OS Threads |
|---|---|
| Green Thread | カーネルが管理 |
| 実際のスレッドの抽象 | ハードウェアに依存 |
| Go runtime が管理 | スレッドのコストが高い |
| 数百万個実行してもパフォーマンスに影響なし | 起動時間が長い |
Stateful Goroutines
状態を維持する goroutine パターン。