🙄

【Python】Coroutine objectってなに?

2024/10/29に公開

はじめに

コルーチン関数(Coroutine Function)は、Pythonにおける非同期プログラミングをサポートするための特殊な関数です。コルーチン関数は、通常の関数とは異なり、一時停止や再開が可能で、非同期処理を効率的に実装することができます。

非同期処理のデバッグ中に「Coroutine object」という文字が表示されて「なんぞや?」」と思ったので調べたことを簡単に書きます。

調べてわかったこと

Pythonで非同期処理を書くときは async / awaitを使います。
例えばこんな感じです。

import asyncio

# コルーチン関数の定義
async def say_hello():
    print("Hello")
    await asyncio.sleep(1)  # 1秒待機(非同期的に)
    print("World")

# メインの実行関数
async def main():
    await say_hello()  # コルーチン関数を非同期に実行

# イベントループを実行
asyncio.run(main())

このasync関数を呼び出すときに awaitを記載せずに非同期関数(コルーチン関数)を呼び出すと、その関数は即座に実行されるのではなく、Coroutine objectが返されます。 これは実行される準備ができた状態ですが、実際に動作はしません。このオブジェクトをawaitしたり、イベントループに渡して実行しない限り、コルーチンは何も処理しません

例えばこんなプログラムを動かすと、Coroutine objectが返ってきます。

import asyncio

# コルーチン関数の定義
async def say_hello():
    print("Hello")
    await asyncio.sleep(1)  # 1秒待機(非同期的に)
    print("World")

# メインの実行関数
async def main():
    # コルーチン関数を呼び出すが、awaitしない
    coroutine_obj = say_hello()
    print("Coroutine object created:", coroutine_obj)

# イベントループを実行
asyncio.run(main())

出力

Coroutine object created: <coroutine object say_hello at 0x7f9c841d7c40>

この場合、say_hello関数は実行されず、単にコルーチンオブジェクトが作成されます。awaitキーワードを使わないため、say_hello関数内のコードは実行されません。

おわりに

「非同期処理って深いな~」と浅い感想を持った瞬間でした。
Coroutine objectについて一つ知識が身について何よりです。

ヘッドウォータース

Discussion