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.run(coro: Coroutine) Any¶
Создаёт новую задачу из заданной корутины и выполняет её до завершения.
Возвращает значение, возвращённое coro.
Дополнительные функции¶
- 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.
class Task¶
- class asyncio.Task¶
Этот объект оборачивает корутину в выполняемую задачу. Задачи можно ожидать с помощью
await task, что приведёт к ожиданию завершения задачи и возврату её возвращаемого значения.Задачи не следует создавать напрямую, вместо этого используйте
create_task()для их создания.
class Event¶
- class asyncio.Event¶
Создаёт новое событие, которое можно использовать для синхронизации задач. События начинаются в сброшенном состоянии.
- set() None¶
Устанавливает событие. Все задачи, ожидающие это событие, будут запланированы на выполнение.
Примечание: это должно вызываться внутри задачи. Небезопасно вызывать это из IRQ, функции обратного вызова планировщика или другого потока. См.
ThreadSafeFlag.
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
Создаёт новый флаг, который можно использовать для синхронизации задачи с кодом, выполняемым вне цикла asyncio, например другими потоками, IRQ или функциями обратного вызова планировщика. Флаги начинаются в сброшенном состоянии.
- set() None¶
Устанавливает флаг. Если есть задача, ожидающая этот флаг, она будет запланирована на выполнение.
class Lock¶
- class asyncio.Lock¶
Создаёт новую блокировку, которую можно использовать для координации задач. Блокировки начинаются в разблокированном состоянии.
Помимо методов, перечисленных ниже, блокировки можно использовать в инструкции
async with.
Потоковые 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.
- 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 байт.Это корутина.
- write(buf: bytes) None¶
Накапливает buf в выходном буфере. Данные сбрасываются только при вызове
Stream.drain(). Рекомендуется вызыватьStream.drain()сразу после вызова этой функции.
Цикл событий¶
- asyncio.get_event_loop() Loop¶
Возвращает цикл событий, используемый для планирования и выполнения задач. См.
Loop.
- asyncio.new_event_loop() Loop¶
Сбрасывает цикл событий и возвращает его.
Примечание: поскольку MicroPython имеет только один цикл событий, эта функция просто сбрасывает состояние цикла, она не создаёт новый.
- class asyncio.Loop¶
Это представляет объект, который планирует и выполняет задачи. Его нельзя создать, вместо этого используйте
get_event_loop().- run_until_complete(awaitable: Awaitable) Any¶
Выполняет заданное awaitable до его завершения. Если awaitable не является задачей, то оно будет преобразовано в задачу.
- set_exception_handler(handler: Callable) None¶
Устанавливает обработчик исключений, вызываемый, когда задача возбуждает неперехваченное исключение. handler должен принимать два аргумента:
(loop, context).
- get_exception_handler() Callable | None¶
Получает текущий обработчик исключений. Возвращает обработчик или
None, если пользовательский обработчик не установлен.