この記事では、Pythonにおける`awaitable`オブジェクトの作成と使用方法について解説します。具体的なコード例とその解説、応用例を含めています。
awaitableオブジェクトとは
`awaitable`オブジェクトは、非同期プログラミングにおいて非常に重要な概念です。一般に、プログラムが非同期タスクを実行する際には、この`awaitable`オブジェクトを`await`キーワードで待機します。Pythonでは、主に3つのタイプの`awaitable`オブジェクトが存在します:コルーチン、タスク、そしてフューチャーです。
基本的な使い方
コルーチン
最も一般的な`awaitable`オブジェクトはコルーチンです。以下はその基本的な使い方です。
# コルーチン関数を定義
async def my_coroutine():
print("コルーチンが実行されました")
return 42
# コルーチンオブジェクトを作成
coro = my_coroutine()
# コルーチンを実行
result = await coro
print(f"結果: {result}")
コード解説
1. `async def`によってコルーチン関数`my_coroutine`を定義しています。
2. コルーチン関数を呼び出すことで、コルーチンオブジェクト`coro`を作成しています。
3. `await`キーワードを使ってコルーチンを実行し、結果を`result`に保存しています。
タスク
タスクは、コルーチンをスケジューラー(イベントループ)に登録することで生成されます。
import asyncio
async def my_coroutine():
print("コルーチンが実行されました")
return 42
# タスクを作成
loop = asyncio.get_event_loop()
task = loop.create_task(my_coroutine())
# タスクの完了を待つ
await task
コード解説
1. コルーチン関数`my_coroutine`を定義しています。
2. イベントループを取得し、タスクを作成しています。
3. `await`でタスクの完了を待っています。
応用例
複数のコルーチンの並行実行
複数のコルーチンを並行して実行する例です。
import asyncio
async def worker_1():
print("worker_1 start")
await asyncio.sleep(1)
print("worker_1 done")
async def worker_2():
print("worker_2 start")
await asyncio.sleep(2)
print("worker_2 done")
await asyncio.gather(worker_1(), worker_2())
コード解説
`asyncio.gather()`を使用して`worker_1`と`worker_2`を並行に実行しています。
例外処理
非同期処理中に例外が発生した場合の処理です。
async def my_coroutine():
raise ValueError("何か問題が発生しました")
try:
await my_coroutine()
except ValueError as e:
print(f"エラーが捕捉されました: {e}")
コード解説
コルーチン内で`ValueError`を発生させ、`try-except`ブロックでそれを捕捉しています。
まとめ
`awaitable`オブジェクトは、非同期プログラミングにおいて非常に重要な概念です。この記事で紹介した基本的な使い方と応用例を理解することで、より効率的な非同期プログラミングが可能になります。
コメント