【こるーちん】

コルーチン とは?

最終更新:
💡 状態を保ち、止めた続きから再開する

実行の途中で状態を保って中断し、後から続きへ戻れる仕組み。中断・再開の操作や実行するスレッドは言語やライブラリによって異なり、非同期処理などに使われる。

📌 このページのポイント
コルーチン:続きから再開する 呼び出し側同じコルーチンi = 1resume:開始yield(1)1を渡して中断i = i + 1resume:再開return i2を返して終了中断中も位置と変数 i を保持する
Luaで、iを1にしてyieldし、再開後に1を足してreturnする例。resumeの戻り値には成功・失敗の真偽値も含まれます。中断・再開の操作は言語ごとに異なります。
ひよこ ひよこ
普通の関数をもう一度呼ぶのとは違うの?
ペンギン先生 ペンギン先生
関数が終了した後に呼び直すと、新しい呼び出しになるよ。コルーチンは、中断した位置や変数の状態を保って続きから再開できる。Luaではyieldで中断し、同じコルーチンをresumeして続けるんだ。
ひよこ ひよこ
どういう場面で役立つの?
ペンギン先生 ペンギン先生
たとえばPythonのasyncioでは、非同期の応答を待つタスクが中断している間、別のタスクを実行できるよ。待ち時間を重ねて扱えるが、CPUで計算を続けている処理が自動で並列になるわけではないんだ。
ひよこ ひよこ
async/awaitなら全部同じ仕組みなの?
ペンギン先生 ペンギン先生
言語ごとに扱いが違うよ。Pythonでは、yieldを含まないasync defがコルーチン関数になる。呼び出すだけでは実行されず、awaitやasyncio.run、タスクの作成などで動かす。キーワードが同じでも、他の言語へそのまま当てはめないようにしよう。
ひよこ ひよこ
スレッドは使わないの?
ペンギン先生 ペンギン先生
コルーチンもスレッド上で実行されるよ。Kotlinではdispatcherが使うスレッドを決め、特定の1本にもスレッドプールにも配置できる。中断後に別のスレッドで再開する場合もあるんだ。
ひよこ ひよこ
ジェネレータもコルーチンなの?
ペンギン先生 ペンギン先生
似た中断・再開の性質はあるが、名前の区別は実装によるよ。Pythonの通常のジェネレータはyieldで値を渡すイテレータ。async defにyieldを含めると非同期ジェネレータになり、asyncioで待つコルーチンとは区別するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コルーチン」って出てきたら「状態を保って中断・再開できる処理」と思えばだいたいOK!
📖 おまけ:英語の意味
「Coroutine」 = 協調ルーチン
💬 Co(協調)+ Routine(手続き)で、お互いに処理を譲り合いながら動くイメージだよ

参考資料

← 用語集にもどる