Python の非同期ジェネレータ

非同期ジェネレータは async for で反復できる非同期イテラブルを作成します。ストリーミングデータの処理に適しています。

基本構文

async def と yield を組み合わせて定義します。

import asyncio

async def async_counter(n):
    for i in range(n):
        await asyncio.sleep(0.5)
        yield i

async def main():
    async for num in async_counter(5):
        print(num)

asyncio.run(main())

0 から 4 まで、0.5 秒間隔で出力されます。

実用例:ページネーション

API からデータを順次取得する例です。

import asyncio

async def fetch_pages(total_pages):
    for page in range(1, total_pages + 1):
        await asyncio.sleep(0.5)  # API呼び出しをシミュレート
        yield {"page": page, "data": f"Content of page {page}"}

async def main():
    async for page_data in fetch_pages(3):
        print(page_data)

asyncio.run(main())

非同期内包表記

async for はリスト内包表記でも使えます。

async def main():
    results = [num async for num in async_counter(5)]
    print(results)  # [0, 1, 2, 3, 4]

通常のジェネレータとの違い

同期ジェネレータ

def + yield で定義。for で反復。

非同期ジェネレータ

async def + yield で定義。async for で反復。

非同期ジェネレータは、データが到着するたびに処理を進められるため、リアルタイムデータの処理やストリーミング API との連携に有用です。