Внимание! Любой асинхронный код написанный на языке Python не будет работать без поддержки его распараллеливания во время выполнения.
Для написания асинхронного кода с использованием синтаксиса async
/await
создан модуль asyncio
, которая будет рассмотрена в разделе "Стандартная библиотека Python3".
Asyncio
используется в качестве основы для нескольких асинхронных сред Python, которые предоставляют высокопроизводительные сетевые и веб-серверы, библиотеки подключений к базам данных, распределенные очереди задач и т. д.
Есть определенный список правил, касающийся использования команд async
/await
.
async def
является сопрограммой. await
, return
или yield
. yield
создает асинхронный генератор, через который можно итерироваться с помощью async for
.async with
запускает асинхронные контекстные менеджеры. yield from
. Это вызовет исключение SyntaxError
.await
можно использовать только в теле сопрограммы. Вызов await
в другом месте спровоцирует исключение SyntaxError
.await
требует наличия awaitable
объекта. Такими объектами могут быть другая сопрограмма или объект у которого определен метод __await__()
.Ключевое слово await
позволяет сопрограмме отдать контроль назад в главный цикл, который содержит порядок исполнения всех сопрограмм.
async def process(): result = await func() return result
Если Python встречает ключевое слово await
то это можно описать так: - "отложить исполнение кода сопрограммы process()
до тех пор, пока я не получу результат выполнения func()
. В это время я займусь чем-нибудь другим".
Внутри тела функции сопрограммы идентификаторы await и async становятся зарезервированными ключевыми словами. Выражения await, async for и async with могут использоваться только в телах функций сопрограмм.
Асинхронный оператор `async for ... in` обеспечивает удобную итерацию по асинхронным итераторам и асинхронным генераторам. Асинхронный оператор `async for ... in` действует только в теле асинхронной функции (сопрограммы) `async def`.
Асинхронный менеджер контекста может приостановить выполнение в своих методах `__aenter__()` и `__aexit__()`. Асинхронный оператор `with` может использоваться только в теле асинхронной функции (сопрограммы).
Асинхронный итератор может вызывать асинхронный код в своем методе `__anext__` и могут использоваться только в асинхронном операторе `async for`.
Наличие выражения yield в функции или методе, определенном с использованием async def, дополнительно определяет функцию как функцию асинхронного генератора.