1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コルーチン、await、pythonの非同期処理

1
Last updated at Posted at 2025-09-07

コルーチンとは(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())

イベントループとは

Pythonのイベントループとは


サンプルコード

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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?