Ответ
Асинхронный генератор — это функция, которая сочетает в себе поведение генератора (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.