【ごるーちん】

Goroutine とは?

最終更新:
💡 小さな働き手に、処理を分けて進める

Goで、他の処理と並行して関数を実行する単位。go文で開始し、GoのランタイムがOSスレッド上で実行を管理する。軽量だが、作成数や完了を待つ方法の設計も必要。

📌 このページのポイント
goroutine:小さな並行実行単位go work()で処理を開始処理1処理2処理3処理4GoランタイムOSスレッド上への実行を管理OSスレッドOSスレッド完了待ち・結果の受け渡しも設計
複数のgoroutineをOSスレッド上で動かす例です。スレッド数は状況によって変わります。
ひよこ ひよこ
goroutineは、何をするもの?
ペンギン先生 ペンギン先生
Goで、関数を他の処理と並行して実行する単位だよ。例えばgo work()と書くと、workの処理を新しいgoroutineで開始し、呼び出した側は完了を待たずに進めるんだ。
ひよこ ひよこ
OSスレッドとは、どう違うの?
ペンギン先生 ペンギン先生
goroutineはGoのランタイムが管理し、複数をOSスレッド上へ割り当てるよ。スタックは小さく始まり、必要に応じて成長する。OSスレッドとは別の実行単位だけれど、実際の処理はOSスレッド上で動くんだ。
ひよこ ひよこ
大量に作れば、その分だけ速い?
ペンギン先生 ペンギン先生
必ず速くなるわけではないよ。並行して扱う処理を分けられても、同時に実行できるかや速度はCPU、処理内容、同期や通信の負担にもよる。goroutineもメモリなどを使うので、作成数や止め方を考えよう。
ひよこ ひよこ
結果は、普通の戻り値で受け取れる?
ペンギン先生 ペンギン先生
go文で開始した関数の戻り値は、呼び出し元へ返されないよ。チャネルなどで結果を受け渡す仕組みを作る。共有データを扱う場合には同期も必要で、goroutineを使うだけでデータ競合がなくなるわけではないんだ。
ひよこ ひよこ
mainが終わったら、残りの処理は待ってくれる?
ペンギン先生 ペンギン先生
main関数が戻るとプログラムは終了し、他のgoroutineの完了を自動では待たないよ。必要な処理が終わったことをチャネルなどで確認してから終了する設計にしよう。処理を始めることと、完了を待つことは別なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「goroutine」って出てきたら「Goで、他の処理と並行して関数を動かす単位」と思えばだいたいOK!
📖 おまけ:英語の意味
「Goroutine」 = Goのルーチン
💬 プログラミング言語「Go」と、処理のひとまとまりを表す「routine(ルーチン)」を組み合わせた言葉だよ。

参考資料

← 用語集にもどる