Python Glossary English

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Сообщить о неточности