8. Asyncio¶
До сих пор каждый скрипт в руководстве был последовательным – одновременно выполняется одна строка, и вызов, который должен ждать (чтение датчика, сетевой обмен, снимок), блокирует скрипт до своего завершения. Это работает, пока есть только одно дело. Как только приложению нужно делать несколько вещей одновременно – выполнять цикл снимков и отвечать на последовательную команду, и загружать кадры по сети – последовательный скрипт перестаёт справляться. Первый же медленный вызов мешает всему остальному двигаться вперёд.
Модуль asyncio – это ответ MicroPython. Он позволяет приложению описать несколько задач как отдельные корутины и выполнять их параллельно в одном потоке, кооперативно – та корутина, которая сейчас выполняется, возвращает управление планировщику всякий раз, когда ей нужно ждать. Цикл снимков, читатель UART и сетевой клиент могут все находиться в одном скрипте, и медленные части одного из них больше не замораживают остальные.
Следующие страницы охватывают ключевые слова async/await и жизненный цикл Task, координацию через gather() и wait_for(), отмену и распространение исключений, три встроенных примитива синхронизации (Event, Lock, ThreadSafeFlag), языковые механизмы для встраивания классов приложения в идиомы asyncio, небольшую обёртку CSI, которая позволяет snapshot() выполняться как корутина, и распространённые подводные камни, сопутствующие кооперативному планированию.
Координация
Примитивы синхронизации
Пользовательские асинхронные объекты
Управление циклом
Захват кадров
Подводные камни
Заключение