Pythonでawaitableオブジェクトの作成と使用

この記事では、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`オブジェクトは、非同期プログラミングにおいて非常に重要な概念です。この記事で紹介した基本的な使い方と応用例を理解することで、より効率的な非同期プログラミングが可能になります。

コメント

コメントする

目次