Async / await в Pybricks
Зачем вообще нужен await
Pybricks — однопоточная среда. Код выполняется строго последовательно, если не используется async/await.
await — это механизм кооперативной многозадачности:
- нет потоков
- нет параллельного выполнения
- есть добровольная передача управления
Код сам сообщает системе:
«Я сейчас жду — можешь выполнить что‑то другое».
Обычное выполнение (без async)
Последовательный код:
функция A:
шаг 1
шаг 2
шаг 3
функция B:
шаг 1
шаг 2
шаг 3
Пока A не закончится, B не начнётся.
Любой wait() блокирует всё.
Async‑функции
Async‑функция объявляется так:
async def task():
...
Такая функция не выполняется напрямую.
Она должна быть:
- либо await‑нута
- либо запущена через run_task() или multitask()
Что делает await
await:
- останавливает текущую задачу
- возвращает управление event loop
- разрешает выполниться другим задачам
Важно:
- await не ускоряет код
- await не создаёт поток
- await — точка переключения
Event loop в Pybricks
В Pybricks есть один event loop:
- он хранит список активных задач
- он выполняет задачи до первого
await - он переключается только в
await
Если задача не делает await, она блокирует всё.
Пример чередования задач
Task A:
шаг 1
await wait(10)
шаг 2
Task B:
шаг 1
await wait(0)
шаг 2
Выполнение:
- A выполняется до
await - A останавливается
- B выполняется
- B останавливается
- Event loop возвращается к A
Это чередование, а не параллельность.
wait() и await wait()
wait(ms) без await:
- блокирует всё
await wait(ms):
- приостанавливает только текущую задачу
- даёт другим задачам выполняться
await wait(0):
- немедленно отдаёт управление
- используется для частого переключения
run_task()
run_task(main())
- запускает одну async‑функцию
- блокирует основной поток
- нельзя вызывать вложенно
run_task() всегда используется один раз.
multitask()
await multitask(task1(), task2())
Позволяет: - запускать несколько async‑задач - выполнять их кооперативно
Параметры:
- race=True — завершить всё, когда первая задача закончится
Что async НЕ делает
Async в Pybricks:
❌ не делает код быстрее
❌ не даёт параллелизм
❌ не гарантирует real‑time
❌ не заменяет таймеры и IRQ
Когда async оправдан
Async полезен, когда есть: - несколько независимых циклов - сенсоры + управление + логика - состояния, а не линейный сценарий
Async — это архитектурный инструмент, а не оптимизация.
Главный принцип
Если код не делает
await, он блокирует всё.
Хорошая async‑задача:
- короткая
- часто делает await
- не содержит долгих вычислений
Итог
await в Pybricks — это:
- добровольная пауза
- кооперативная многозадачность
- способ держать систему управляемой
Это не магия.
Это дисциплина.