8.13. Управління циклом

Більшість скриптів asyncio ніколи не торкаються циклу подій безпосередньо — asyncio.run() достатньо. Ця сторінка охоплює поверхню Loop для випадків, коли цього недостатньо: встановлення обробника виключень, запуск циклу з іншим життєвим циклом ніж run, або зберігання об’єкта циклу для інструментування.

8.13.1. Отримання циклу

  • asyncio.get_event_loop() — повертає об’єкт Loop. Безпечно викликати як зсередини, так і ззовні корутини.

  • asyncio.new_event_loop() — у MicroPython скидає стан існуючого циклу, а не створює новий. Варто повторити: існує рівно один цикл подій на програму.

Немає API для запуску циклу, окрім методів на Loop та asyncio.run().

8.13.2. Безпосередній запуск циклу

asyncio.run() — правильна точка входу майже для кожного застосунку. Два методи Loop існують для випадків, коли це не так.

  • run_until_complete() — отримавши awaitable, запускає цикл до завершення цього awaitable, потім повертає його результат. Еквівалентно одному виклику asyncio.run() без завершення циклу.

  • run_forever() — запускає цикл доти, доки stop() не буде викликано зсередини задачі. Без верхньорівневого awaitable; очікується, що застосунок заплановує все необхідне через asyncio.create_task() перед викликом run_forever.

Супутні методи: stop() (запросити зупинку циклу після завершення поточної задачі) та close() (звільнити ресурси циклу).

8.13.3. Створення задач на рівні циклу

  • create_task() — та сама операція, що й asyncio.create_task(). Вільна функція існує, щоб код застосунку не потребував посилання на цикл у звичайному випадку; метод існує для інструментування, де посилання вже є.

8.13.4. Обробники виключень

Цикл викликає обробник, коли задача підіймає виключення, що ніщо в ланцюгу викликів корутини не перехопило — типовий випадок: задача, створена застосунком через asyncio.create_task() і ніколи не await-нута. Стандартний обробник друкує трасування через sys.stderr; сторінка виключення показала, як замінити його на власний.

  • set_exception_handler() — встановити власний обробник. Обробник — це callable handler(loop, context), де context — словник з принаймні 'message' та зазвичай 'exception' і 'future'.

  • get_exception_handler() — повернути поточно встановлений обробник або None, якщо використовується стандартний.

  • default_exception_handler() — вбудований обробник. Корисний всередині власного обробника, що хоче також запустити стандартну поведінку (записати у флеш-пам’ять і надрукувати трасування, наприклад).

  • call_exception_handler() — запустити поточно встановлений обробник із вручну побудованим словником контексту. Переважно використовується самим циклом; застосунок рідко потребує цього.