コルーチンの定義と使い方
Pythonの非同期処理において、「コルーチン」は非常に重要な概念です。コルーチンは、非同期的に動作する関数の一種で、async
キーワードを使って定義されます。コルーチンを使うと、長時間かかる処理をブロックせずに並行して実行することが可能です。ここでは、コルーチンの定義と基本的な使い方について解説します。
コルーチンの定義
コルーチンは、通常の関数の定義にasync
を追加することで定義します。さらに、コルーチン内で非同期処理を行う場合はawait
を使います。以下に、基本的なコルーチンの定義を示します。
import asyncio
# コルーチンの定義
async def my_coroutine():
print("コルーチンが始まりました")
await asyncio.sleep(1) # 1秒待機
print("1秒待機後、コルーチンが終了しました")
# イベントループでコルーチンを実行
asyncio.run(my_coroutine())
この例では、async
を使ってmy_coroutine
をコルーチンとして定義し、await asyncio.sleep(1)
で1秒間の非同期待機を行っています。asyncio.run()
でコルーチンを実行することで、イベントループ上でコルーチンが動作します。
複数のコルーチンを並行して実行
Pythonでは、複数のコルーチンを並行して実行することができます。これを実現するためには、asyncio.gather()
やasyncio.create_task()
を使います。
import asyncio
# 複数のコルーチン
async def my_coroutine_1():
print("コルーチン1: 開始")
await asyncio.sleep(2)
print("コルーチン1: 終了")
async def my_coroutine_2():
print("コルーチン2: 開始")
await asyncio.sleep(1)
print("コルーチン2: 終了")
async def main():
# 2つのコルーチンを並行して実行
await asyncio.gather(my_coroutine_1(), my_coroutine_2())
# イベントループで実行
asyncio.run(main())
この例では、2つのコルーチンmy_coroutine_1
とmy_coroutine_2
をasyncio.gather()
で並行して実行しています。my_coroutine_1
は2秒待機し、my_coroutine_2
は1秒待機します。これにより、2つのコルーチンが同時に動作していることが確認できます。
コルーチンの実行結果を待つ
コルーチンが結果を返す場合、その結果を取得することも可能です。コルーチンの実行が終了するまで待機し、結果を利用します。
import asyncio
# コルーチンの定義
async def add(a, b):
print(f"計算中: {a} + {b}")
await asyncio.sleep(1)
return a + b
async def main():
# コルーチンを実行して結果を取得
result = await add(10, 20)
print(f"結果: {result}")
# イベントループで実行
asyncio.run(main())
この例では、add
というコルーチンが10 + 20
の計算を行い、1秒待機後に結果を返します。await add()
を使ってその結果を取得し、結果を出力しています。
コルーチンと例外処理
コルーチン内で例外処理を行う場合も、通常のtry-except
構文を使用します。非同期処理中に発生する例外も捕捉して、適切に処理することが可能です。
import asyncio
async def divide(a, b):
try:
result = a / b
except ZeroDivisionError:
print("ゼロ除算エラー")
return None
await asyncio.sleep(1)
return result
async def main():
print("10 / 2 = ", await divide(10, 2))
print("10 / 0 = ", await divide(10, 0))
asyncio.run(main())
この例では、ゼロ除算エラーを捕捉し、エラー発生時にNone
を返しています。例外処理を適切に行うことで、非同期処理中のエラーにも柔軟に対応できます。
まとめ
Pythonのコルーチンは、非同期処理を実現するための重要な機能です。async
キーワードを使ってコルーチンを定義し、await
を使用して非同期的に待機します。コルーチンを使うことで、時間のかかる処理を効率的に管理でき、複数のコルーチンをasyncio.gather()
やasyncio.create_task()
を用いて並行して実行することが可能です。また、コルーチン内で例外処理を行い、エラーに対処する方法もサポートされています。