世界の国559994 views
中学理科1625756 views
高校日本史189759 views
数学講師2847003 views
中学英語808125 views
英語606840 views
高校国語785262 views
中学社会666920 views
小学社会308525 views
高校物理158008 views
Help
Tools

English

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