Python 3.6+Итераторы и генераторыконструкция
Асинхронный генератор
генераторы
Функция async def с yield внутри: отдаёт значения по одному и между ними может ждать await. Перебирается через async for.
Синтаксис
async def имя(...):
yield значение
async for x in имя(...): ...
Главная ловушка: обычный for такой объект не перебирает — будет TypeError, нужен async for или [x async for x in ...] внутри корутины. В отличие от обычного генератора, внутри нельзя писать yield from и return со значением — это SyntaxError. Нужно ждать ввод-вывод между значениями — берите асинхронный генератор; ждать нечего — хватит обычного.
Примеры
import asyncio
async def countdown(n):
while n > 0:
yield n
await asyncio.sleep(0)
n -= 1
async def main():
async for i in countdown(3):
print(i) # → 3 / 2 / 1
print([i async for i in countdown(2)]) # → [2, 1]
asyncio.run(main())
async def agen():
yield 1
print(type(agen()).__name__) # → async_generator
for x in agen(): # → TypeError
pass
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности