Computer365519 views
いろは2989323 views
高校化学2914333 views
ヒストリア284772 views
教育148971 views
中学数学621615 views
中学社会667260 views
高校倫理1434006 views
高校日本史189930 views
英語608578 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 との連携に有用です。