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¶
Встановлює подію. Усі завдання, що очікують на подію, буде заплановано до виконання.
Примітка: виклик має здійснюватися зсередини завдання. Небезпечно викликати це з переривання, зворотного виклику планувальника або іншого потоку. Дивіться
ThreadSafeFlag.
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
Створює новий прапорець, який може використовуватися для синхронізації завдання з кодом, що виконується поза циклом asyncio, наприклад в інших потоках, перериваннях або зворотних викликах планувальника. Прапорці починаються в очищеному стані.
- 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. Якщо EOF зустрінуто до читання будь-яких байт, повертається порожній об’єкт bytes.
Це корутина.
- readinto(buf: bytearray | memoryview) int¶
Читає до n байт у buf, де n дорівнює довжині buf.
Повертає кількість байт, прочитаних у buf.
Це корутина та розширення MicroPython.
- readexactly(n: int) bytes¶
Читає рівно n байт і повертає їх як об’єкт bytes.
Якщо потік завершується до читання n байт, виникає виняток
EOFError.Це корутина.
- 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().- create_task(coro: Coroutine) Task¶
Створює завдання із зазначеного coro і повертає новий об’єкт
Task.
- run_until_complete(awaitable: Awaitable) Any¶
Виконує зазначений awaitable до його завершення. Якщо awaitable не є завданням, воно буде підвищено до нього.
- set_exception_handler(handler: Callable) None¶
Встановлює обробник винятків, який викликається, коли завдання породжує незловлений виняток. handler має приймати два аргументи:
(loop, context).