asyncio — планировщик асинхронного ввода-вывода

Этот модуль предоставляет планировщик кооперативной многозадачности для корутин async/await, а также примитивы для синхронизации (блокировки, события) и неблокирующей сетевой работы по TCP через потоковые объекты чтения и записи. Задачи выполняются конкурентно в одном цикле событий; текущая выполняемая задача возвращает управление циклу с помощью await.

Пример:

import asyncio

async def blink(led, period_ms):
    while True:
        led.on()
        await asyncio.sleep_ms(5)
        led.off()
        await asyncio.sleep_ms(period_ms)

async def main(led1, led2):
    asyncio.create_task(blink(led1, 700))
    asyncio.create_task(blink(led2, 400))
    await asyncio.sleep_ms(10_000)

# Running on an OpenMV Cam
from machine import LED
asyncio.run(main(LED(1), LED(2)))

Основные функции

asyncio.create_task(coro: Coroutine) Task

Создаёт новую задачу из заданной корутины и планирует её выполнение.

Возвращает соответствующий объект Task.

asyncio.current_task() Task

Возвращает объект Task, связанный с текущей выполняемой задачей.

asyncio.run(coro: Coroutine) Any

Создаёт новую задачу из заданной корутины и выполняет её до завершения.

Возвращает значение, возвращённое coro.

asyncio.sleep(t: float) None

Приостанавливает выполнение на t секунд (может быть числом с плавающей точкой).

Это корутина.

asyncio.sleep_ms(t: int) None

Приостанавливает выполнение на t миллисекунд.

Это корутина и расширение MicroPython.

Дополнительные функции

asyncio.wait_for(awaitable: Awaitable, timeout: float) Any

Ожидает завершения awaitable, но отменяет его, если оно занимает больше timeout секунд. Если awaitable не является задачей, то из него будет создана задача.

Если истекает время ожидания, задача отменяется и возбуждается asyncio.TimeoutError: это исключение должно быть перехвачено вызывающим кодом. Задача получает asyncio.CancelledError, которое можно проигнорировать или перехватить с помощью try...except или try...finally для выполнения кода очистки.

Возвращает возвращаемое значение awaitable.

Это корутина.

asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any

Аналогично wait_for(), но timeout задаётся целым числом в миллисекундах.

Это корутина и расширение MicroPython.

asyncio.gather(*awaitables, return_exceptions: bool = False) List

Выполняет все awaitables конкурентно. Любые awaitables, не являющиеся задачами, преобразуются в задачи.

Возвращает список возвращаемых значений всех awaitables.

Это корутина.

class Task

class asyncio.Task

Этот объект оборачивает корутину в выполняемую задачу. Задачи можно ожидать с помощью await task, что приведёт к ожиданию завершения задачи и возврату её возвращаемого значения.

Задачи не следует создавать напрямую, вместо этого используйте create_task() для их создания.

cancel() None

Отменяет задачу, внедряя в неё asyncio.CancelledError. Задача может проигнорировать это исключение. Код очистки можно выполнить, перехватив его, или с помощью try ... finally.

class Event

class asyncio.Event

Создаёт новое событие, которое можно использовать для синхронизации задач. События начинаются в сброшенном состоянии.

is_set() bool

Возвращает True, если событие установлено, и False в противном случае.

set() None

Устанавливает событие. Все задачи, ожидающие это событие, будут запланированы на выполнение.

Примечание: это должно вызываться внутри задачи. Небезопасно вызывать это из IRQ, функции обратного вызова планировщика или другого потока. См. ThreadSafeFlag.

clear() None

Сбрасывает событие.

wait() None

Ожидает установки события. Если событие уже установлено, возвращает управление немедленно.

Это корутина.

class ThreadSafeFlag

class asyncio.ThreadSafeFlag

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

set() None

Устанавливает флаг. Если есть задача, ожидающая этот флаг, она будет запланирована на выполнение.

clear() None

Сбрасывает флаг. Это может использоваться для гарантии того, что ранее, возможно, установленный флаг сброшен перед ожиданием его установки.

wait() None

Ожидает установки флага. Если флаг уже установлен, возвращает управление немедленно. Флаг автоматически сбрасывается при возврате из wait.

Флаг может ожидаться только одной задачей одновременно.

Это корутина.

class Lock

class asyncio.Lock

Создаёт новую блокировку, которую можно использовать для координации задач. Блокировки начинаются в разблокированном состоянии.

Помимо методов, перечисленных ниже, блокировки можно использовать в инструкции async with.

locked() bool

Возвращает True, если блокировка заблокирована, и False в противном случае.

acquire() bool

Ожидает, пока блокировка не перейдёт в разблокированное состояние, а затем атомарно блокирует её. Только одна задача может захватить блокировку в любой момент времени.

Это корутина.

release() None

Освобождает блокировку. Если какие-либо задачи ожидают блокировку, то следующая в очереди планируется на выполнение, а блокировка остаётся заблокированной. В противном случае, если задач не ожидает, блокировка становится разблокированной.

Потоковые TCP-соединения

asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]

Открывает TCP-соединение с заданным host и port. Адрес host будет разрешён с помощью socket.getaddrinfo(), который в настоящее время является блокирующим вызовом. Если ssl является объектом ssl.SSLContext, этот контекст используется для создания транспорта; если ssl равно True, используется контекст по умолчанию.

Возвращает пару потоков: поток для чтения и поток для записи. Возбудит специфичное для сокета исключение OSError, если хост не удалось разрешить или если соединение не удалось установить.

Это корутина.

asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server

Запускает TCP-сервер на заданных host и port. callback будет вызываться для входящих принятых соединений, и ему будут переданы 2 аргумента: потоки для чтения и записи данного соединения.

Если ssl является объектом ssl.SSLContext, этот контекст используется для создания транспорта.

Возвращает объект Server.

Это корутина.

class asyncio.Stream

Это представляет потоковое TCP-соединение. Чтобы минимизировать код, этот класс реализует как объект чтения, так и объект записи, и оба имени StreamReader и StreamWriter являются псевдонимами этого класса.

get_extra_info(v: str) Any

Получает дополнительную информацию о потоке, заданную значением v. Допустимые значения для v: peername.

close() None

Закрывает поток.

wait_closed() None

Ожидает закрытия потока.

Это корутина.

read(n: int = -1) bytes

Читает до n байт и возвращает их. Если n не указано или равно -1, читает все байты до EOF. Возвращаемое значение будет пустым объектом bytes, если EOF встречается до того, как будут прочитаны какие-либо байты.

Это корутина.

readinto(buf: bytearray | memoryview) int

Читает до n байт в buf, где n равно длине buf.

Возвращает количество байт, прочитанных в buf.

Это корутина и расширение MicroPython.

readexactly(n: int) bytes

Читает ровно n байт и возвращает их в виде объекта bytes.

Возбуждает исключение EOFError, если поток заканчивается до прочтения n байт.

Это корутина.

readline() bytes

Читает строку и возвращает её.

Это корутина.

write(buf: bytes) None

Накапливает buf в выходном буфере. Данные сбрасываются только при вызове Stream.drain(). Рекомендуется вызывать Stream.drain() сразу после вызова этой функции.

drain() None

Сбрасывает (записывает) все буферизованные выходные данные в поток.

Это корутина.

class asyncio.Server

Это представляет класс сервера, возвращаемый функцией start_server(). Его можно использовать в инструкции async with для закрытия сервера при выходе.

close() None

Закрывает сервер.

wait_closed() None

Ожидает закрытия сервера.

Это корутина.

Цикл событий

asyncio.get_event_loop() Loop

Возвращает цикл событий, используемый для планирования и выполнения задач. См. Loop.

asyncio.new_event_loop() Loop

Сбрасывает цикл событий и возвращает его.

Примечание: поскольку MicroPython имеет только один цикл событий, эта функция просто сбрасывает состояние цикла, она не создаёт новый.

class asyncio.Loop

Это представляет объект, который планирует и выполняет задачи. Его нельзя создать, вместо этого используйте get_event_loop().

create_task(coro: Coroutine) Task

Создаёт задачу из заданного coro и возвращает новый объект Task.

run_forever() None

Выполняет цикл событий до вызова stop().

run_until_complete(awaitable: Awaitable) Any

Выполняет заданное awaitable до его завершения. Если awaitable не является задачей, то оно будет преобразовано в задачу.

stop() None

Останавливает цикл событий.

close() None

Закрывает цикл событий.

set_exception_handler(handler: Callable) None

Устанавливает обработчик исключений, вызываемый, когда задача возбуждает неперехваченное исключение. handler должен принимать два аргумента: (loop, context).

get_exception_handler() Callable | None

Получает текущий обработчик исключений. Возвращает обработчик или None, если пользовательский обработчик не установлен.

default_exception_handler(context: dict) None

Обработчик исключений по умолчанию, который вызывается.

call_exception_handler(context: dict) None

Вызывает текущий обработчик исключений. Аргумент context передаётся напрямую и является словарём, содержащим ключи: 'message', 'exception', 'future'.