Goroutines

Go 言語げんご並行へいこう処理しょり基礎きそ:Goroutine とスケジューラ。

Goroutine 概念

  1. 同期どうき実行じっこう
  2. 無名むめい関数かんすうの goroutine
  3. WaitGroup を使つかったより堅牢けんろう制御せいぎょ
  4. 軽量けいりょうなアプリケーションレベルのスレッド、独立どくりつした実行じっこうフローを
  5. 独自どくじのスケジューラをち、goroutine を OS レベルのスレッドに多重化たじゅうか
  6. 任意にんいかずの goroutine を任意にんいかずの OS Thread にスケジュール(m:n 多重化たじゅうか
  7. Channel通信つうしん

Runtime Scheduler

Go Runtime Scheduler Kernel
  • 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)
Go Runtime Scheduler

Context Switching

えが発生はっせいする場所ばしょ

  • Function Call
  • Garbage Collection
  • Network Calls
  • Channel Operations
  • go キーワードを使用しようするとき

Goroutine Leak

Goroutine クリーンアップの重要性じゅうようせい

  • goroutine を起動きどうするさいは、かなら最終的さいしゅうてき終了しゅうりょうすることを確認かくにんする
  • 終了しゅうりょうしない goroutine は予約よやくしたメモリを永久えいきゅう占有せんゆうする。これを goroutine leak
  • goroutine が I/O(channel 通信つうしんなど)で永遠えいえんにブロックされたり、無限むげんループにおちいったりするとリークが発生はっせい

OS Threads との比較

GoroutineOS Threads
Green Threadカーネルが管理かんり
実際じっさいのスレッドの抽象ちゅうしょうハードウェアに依存いぞん
Go runtime が管理かんりスレッドのコストがたか
数百万すうひゃくまん実行じっこうしてもパフォーマンスに影響えいきょうなし起動きどう時間じかんなが

Stateful Goroutines

状態じょうたい維持いじする goroutine パターン。

関連トピック