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()— встановити власний обробник. Обробник — це callablehandler(loop, context), деcontext— словник з принаймні'message'та зазвичай'exception'і'future'.get_exception_handler()— повернути поточно встановлений обробник абоNone, якщо використовується стандартний.default_exception_handler()— вбудований обробник. Корисний всередині власного обробника, що хоче також запустити стандартну поведінку (записати у флеш-пам’ять і надрукувати трасування, наприклад).call_exception_handler()— запустити поточно встановлений обробник із вручну побудованим словником контексту. Переважно використовується самим циклом; застосунок рідко потребує цього.