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í objekt Loop. 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áno stop(). Žádný awaitable na nejvyšší úrovni; očekává se, že aplikace naplánuje cokoli potřebuje pomocí asyncio.create_task() před voláním run_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 jako asyncio.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ý objekt handler(loop, context), kde context je slovník obsahující alespoň 'message' a obvykle 'exception' a 'future'.

  • get_exception_handler() – vrací aktuálně nainstalovanou obslužnou rutinu, nebo None, 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.