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, скасування та примітиви синхронізації, застосовується безпосередньо.