8.13. Řízení smyčky¶
Většina asyncio skriptů se smyčky událostí nikdy přímo nedotkne – asyncio.run() stačí. Tato stránka pokrývá rozhraní Loop pro případy, kdy to nestačí: instalaci obslužné rutiny výjimek, spouštění smyčky s jiným životním cyklem než run nebo podržení objektu smyčky pro instrumentaci.
8.13.1. Získání smyčky¶
asyncio.get_event_loop()– vrací objektLoop. Lze bezpečně volat zevnitř i zvenčí korutiny.asyncio.new_event_loop()– v MicroPythonu resetuje stav existující smyčky, namísto aby vytvořila novou. Poznámka, kterou stojí za to zopakovat: na program existuje právě jedna smyčka událostí.
Neexistuje žádné API pro spouštění smyčky kromě metod na Loop a asyncio.run().
8.13.2. Přímé spuštění smyčky¶
asyncio.run() je správným vstupním bodem pro téměř každou aplikaci. Pro případy, kdy tomu tak není, existují dvě metody Loop.
run_until_complete()– pro daný awaitable spouští smyčku, dokud tento awaitable neskončí, a poté vrátí jeho výsledek. Ekvivalentní jednomu voláníasyncio.run(), s vynechaným ukončením smyčky.run_forever()– spouští smyčku, dokud není zevnitř úlohy zavolánostop(). Žádný awaitable na nejvyšší úrovni; očekává se, že aplikace naplánuje cokoli potřebuje pomocíasyncio.create_task()před volánímrun_forever.
Doprovodnými metodami jsou stop() (požadavek na zastavení smyčky po dokončení aktuální úlohy) a close() (uvolnění zdrojů smyčky).
8.13.3. Vytváření úloh na straně smyčky¶
create_task()– stejná operace jakoasyncio.create_task(). Volná funkce existuje proto, aby aplikační kód v běžném případě nepotřeboval odkaz na smyčku; metoda existuje pro instrumentaci, která jej již má.
8.13.4. Obslužné rutiny výjimek¶
Smyčka volá obslužnou rutinu, když úloha vyvolá výjimku, kterou nic v řetězci volání korutin nezachytilo – typickým případem je úloha, kterou aplikace vytvořila pomocí asyncio.create_task() a nikdy na ni nečekala. Výchozí obslužná rutina vypíše trasování zásobníku přes sys.stderr; stránka o výjimkách ukázala, jak ji vyměnit za něco vlastního.
set_exception_handler()– nainstaluje vlastní obslužnou rutinu. Obslužná rutina je volatelný objekthandler(loop, context), kdecontextje slovník obsahující alespoň'message'a obvykle'exception'a'future'.get_exception_handler()– vrací aktuálně nainstalovanou obslužnou rutinu, neboNone, pokud se používá výchozí.default_exception_handler()– vestavěná obslužná rutina. Užitečná uvnitř vlastní obslužné rutiny, která chce také spustit výchozí chování (například zapsat do flash paměti a zároveň vypsat trasování zásobníku).call_exception_handler()– spustí aktuálně nainstalovanou obslužnou rutinu s ručně sestaveným slovníkem kontextu. Používá ji většinou samotná smyčka; aplikace ji potřebuje jen zřídka.