高校国語786382 views
教育149096 views
Computer366119 views
高校物理158718 views
高校化学2916128 views
中学社会667518 views
雑学1472959 views
小学算数1197058 views
小学理科718021 views
小学社会308993 views

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 との連携に有用です。