非同期ジェネレータは 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 との連携に有用です。