🙄
【Python】Coroutine objectってなに?
はじめに
コルーチン関数(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