Асинхронные функции (сопрограммы) являются более обобщенной формой подпрограмм.
Подпрограммы вводятся в одной точке и выходят в другой точке. Выполнение сопрограмм в 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>
внутри него, являются почти сопрограммами, но не совсем. Единственное отличие состоит в том, что функция генератор не может контролировать где продолжиться выполнение после ее завершения, при этом дальнейшее управление всегда передается вызывающей стороне.