コルーチンの定義と使い方 | コルーチン | Python本格超入門

スポンサーリンク
スポンサーリンク

コルーチンの定義と使い方

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_1my_coroutine_2asyncio.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()を用いて並行して実行することが可能です。また、コルーチン内で例外処理を行い、エラーに対処する方法もサポートされています。