8. Asyncio¶
До цього кожен скрипт у посібнику був послідовним — одна рядок виконується за раз, а виклик, що має чекати (зчитування датчика, мережевий запит-відповідь, знімок), блокує скрипт до завершення. Це працює, поки є лише одне завдання. Щойно застосунку потрібно робити кілька речей одночасно — запускати цикл знімків і відповідати на послідовну команду, і завантажувати кадри через мережу — послідовний скрипт ламається. Перший повільний виклик зупиняє все інше.
Модуль asyncio — відповідь MicroPython. Він дозволяє застосунку описати кілька завдань як окремі корутини і виконувати їх паралельно в одному потоці, кооперативно — яка б корутина не виконувалась зараз, вона поступається керуванням назад планувальнику, щойно їй потрібно чекати. Цикл знімків, зчитувач UART та мережевий клієнт можуть всі жити в одному скрипті, і повільні частини одного більше не заморожують інші.
Наступні сторінки охоплюють ключові слова async/await та життєвий цикл Task, координацію через gather() та wait_for(), скасування та поширення виключень, три вбудовані примітиви синхронізації (Event, Lock, ThreadSafeFlag), мовні хуки для підключення класів застосунку до ідіом asyncio, невелику обгортку CSI, що дозволяє snapshot() виконуватись як корутина, та поширені підводні камені кооперативного планування.
Координація
Примітиви синхронізації
Власні асинхронні об'єкти
Управління циклом
Захоплення кадрів
Підводні камені
Підсумок