8.16. Підсумок

Ви пройшли через API asyncio – елементи, необхідні скрипту для паралельного виконання кількох завдань на одному процесорі:

  • Кооперативне планування – модель, на якій базується решта модуля. Запущена корутина має цикл виключно для себе, поки не виконає awaits; перемикання відбуваються лише в цих точках await.

  • Корутини та завданняasync def визначає одиницю роботи; asyncio.create_task() планує її паралельно і повертає Task, на який програма може пізніше зачекати, скасувати або ідентифікувати.

  • Цикл подій – рушій, що виконує корутини та завдання. asyncio.run() є єдиною точкою входу, що потрібна більшості скриптів; клас Loop надає решту для рідкісних випадків, де це необхідно.

  • Координаціяgather() для розгалуження та збирання, wait_for() для дедлайнів, Task.cancel і шаблон очищення з блоком finally, розповсюдження винятків через завдання та виклики gather, і хук обробника винятків циклу.

  • Примітиви синхронізаціїEvent для сигналізації між корутинами, Lock для послідовного доступу до спільного ресурсу між await-ами, і ThreadSafeFlag для пробудження завдання asyncio з обробника переривань.

  • Власні асинхронні об’єкти – мовні хуки, що дозволяють класам програми підключатися до ідіом asyncio. __await__ для об’єктів, що самі є ціллю await, __aiter__ / __anext__ для async for, і __aenter__ / __aexit__ для async with.

  • Захоплення кадрів – обгортка, що перетворює csi.CSI.snapshot() на корутину, сумісну з await, щоб цикл захоплення виконувався паралельно з іншою роботою asyncio.

  • Підводні камені – забуті awaits, щільні цикли без поступок, поглинені скасування, спільний стан, що змінюється між await-ами, та інші пастки, специфічні для asyncio.

Цього достатньо для написання програм, що поєднують роботу з камерою, апаратний ввід/вивід та паралельну фонову роботу в одному циклі.

8.16.1. Використання цього довідника пізніше

Ставтесь до розділів asyncio як до довідкового матеріалу; повертайтесь сюди за шаблоном async with або точною поведінкою gather() при збої дочірнього завдання – це саме призначений спосіб використання. Сторінка довідника asyncio перелічує всі функції та класи в одному місці, коли питання лише «яка точна назва цього виклику».

Для більш розвинених примітивів на основі модуля – семафорів, черг, бар’єрів та значної колекції помічників у вигляді готових шаблонів – репозиторій peterhinch/micropython-async є стандартним джерелом, що підтримується спільнотою.

8.16.2. Куди рухатися далі

Мережа – наступна велика тема. asyncio.open_connection(), asyncio.start_server() та клас Stream – це те, як скрипт asyncio спілкується з мережею зсередини корутини, разом із модулями network та socket під ним. Все, що ви дізналися про await, Task, скасування та примітиви синхронізації, застосовується безпосередньо.