Сообщить об ошибке.

Сопрограммы/корутины async def в Python

Асинхронные функции (сопрограммы)

Асинхронные функции (сопрограммы) являются более обобщенной формой подпрограмм.

Подпрограммы вводятся в одной точке и выходят в другой точке. Выполнение сопрограмм в Python может быть приостановлено и возобновлено в разных точках. Они могут быть реализованы с помощью оператора async def.

async def coroutine(param1, param2):
    do_stuff()
    await some_coroutine()

Внутри тела функции сопрограммы идентификаторы await и async становятся зарезервированными ключевыми словами. Выражения await, async for и async with могут использоваться только в телах функций сопрограмм.

При использовании выражения yield from <expr> в теле функции сопрограммы, появляется исключение SyntaxError.

Примеры:

import asyncio

async def ticker(delay, to):
    for i in range(to):
        yield (i, delay)
        await asyncio.sleep(delay)
        
async def run(k):
    async for i in ticker(k, 5):
        print(i)

async def main():
    task1 = asyncio.create_task(run(0.5))
    task2 = asyncio.create_task(run(1))
    # планируем одновременные вызовы:
    await asyncio.gather(task1, task2)


if __name__ == '__main__':
    asyncio.run(main())
    
# (0, 0.5)
# (0, 1)
# (1, 0.5)
# (1, 1)
# (2, 0.5)
# (3, 0.5)
# (2, 1)
# (4, 0.5)
# (3, 1)
# (4, 1)

Понимание сопрограмм.

Сопрограмма - это такая сущность, которой можно передавать и получать назад управление, передавать и получать данные и которая к тому же хранит внутреннее состояние. Сопрограммы являются естественным способом выражения многих алгоритмов, таких как симуляции, игры, асинхронный ввод-вывод и другие формы программирования, управляемого событиями, или совместной многозадачности.

Функции генератора, с выражением yield from <expr> внутри него, являются почти сопрограммами, но не совсем. Единственное отличие состоит в том, что функция генератор не может контролировать где продолжиться выполнение после ее завершения, при этом дальнейшее управление всегда передается вызывающей стороне.