コルーチンとは(co-routine)
コルーチンとは、実行中に処理を中断・再開できる「協調するサブルーチン」のことです。通常のサブルーチンと異なり、複数の入り口と出口を持ち、途中の状態を保持できるため、非同期処理や複数の処理を協調させたい場合に効率的なコード記述を可能にするプログラミングの構造です。
コルーチンオブジェクト
- コルーチンオブジェクトは「実行予定の処理」を表すオブジェクト
example.py
# レシピ(コルーチン)を作る
recipe = make_cake() # レシピができるだけ、まだケーキは作られていない
# レシピに従ってケーキを作る
cake = await recipe # ここで初めてケーキが作られる
awaitを付与せずにプログラムを実行した場合は警告が出る
example.py
# この書き方だと...
recipe = make_cake() # コルーチンオブジェクトを作ったけどawaitを使わないと実行時に警告が出る
# RuntimeWarning: coroutine 'make_cake' was never awaited
await
-
awaitの役割
- awaitは「このコルーチンを実行して、完了まで待つ」という意味
- awaitをつけることで、コルーチンオブジェクトが実際に実行される
-
なぜawaitが必要で、なぜこの仕組みなのか
- 遅延実行: コルーチンは「後で実行する処理」を表現できる。必要時まで実行を遅延する。
- 制御の移譲: awaitによって、「いつ実行するか」をイベントループに委ねる
- 並行性: 複数のコルーチンを効率的に切り替えながら実行できる
イベントループへタスクの登録
- create_task
- 登録と実行をする
- await
- 完了待ちと結果を返す
example.py
task = asyncio.create_task(func()) # ← イベントループに登録&実行開始!
# ↑ 変数に保存は関係ない
await task # ← これは完了を待つだけ
# 一行で書くとこうなる
await asyncio.create_task(func())
イベントループとは
サンプルコード
sample.py
import asyncio
async def display_results(name, delay):
await asyncio.sleep(delay) #処理の重さとしての仮の処理時間
return print(f"{name}_result")
async def func():
task_a = asyncio.create_task(display_results("A", 0.3))
task_b = asyncio.create_task(display_results("B", 0.5))
task_c = asyncio.create_task(display_results("C", 0.2))
await task_a
await task_b
await task_c
def main():
asyncio.run(func()) #タスクが登録されているハズのイベントループを実行する
if __name__ == "__main__":
main()
実行結果:
C_result
A_result
B_result