Что такое асинхронный генератор в Python?

Ответ

Асинхронный генератор — это функция, которая сочетает в себе поведение генератора (yield) и асинхронной корутины (async/await). Это позволяет создавать итераторы, которые могут приостанавливать свое выполнение не только для выдачи значения, но и для ожидания завершения асинхронной операции.

Объявляется с помощью async def и использует yield для возврата значений.

Ключевые особенности:

  • Итерация: Перебор значений осуществляется с помощью цикла async for.
  • Асинхронные вызовы: Внутри генератора можно использовать await для вызова других корутин.
  • Отложенные вычисления: Как и обычные генераторы, они производят значения «лениво», по одному за раз.

Пример:

import asyncio

# Асинхронный генератор, который имитирует
# получение данных из сети с задержкой.
async def fetch_data_stream(count: int):
    for i in range(count):
        # Имитация асинхронного I/O-запроса
        await asyncio.sleep(0.5)
        yield f"Chunk #{i + 1}"

async def main():
    print("Starting data stream...")
    # Используем async for для итерации по асинхронному генератору
    async for chunk in fetch_data_stream(3):
        print(f"Received: {chunk}")

asyncio.run(main())

Основное отличие от обычного генератора: Возможность выполнять await между операциями yield, что идеально подходит для работы с потоковыми данными, веб-сокетами или постраничной загрузкой из API.