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