8.13. Hurokvezérlés

A legtöbb asyncio-szkript soha nem nyúl közvetlenül az eseményhurokhoz – az asyncio.run() elegendő. Ez az oldal a Loop felületét tárgyalja azokra az esetekre, amikor nem az: kivételkezelő telepítése, a hurok futtatása a run-tól eltérő életciklussal, vagy a hurokobjektum megtartása műszerezés céljából.

8.13.1. A hurok megszerzése

  • asyncio.get_event_loop() – visszaadja a Loop objektumot. Biztonságosan hívható korutinon belülről és kívülről egyaránt.

  • asyncio.new_event_loop() – a MicroPythonon visszaállítja a meglévő hurok állapotát, ahelyett hogy újat hozna létre. A megjegyzés ismétlést érdemel: programonként pontosan egy eseményhurok van.

Nincs API a hurok futtatására a Loop metódusain és az asyncio.run()-on kívül.

8.13.2. A hurok közvetlen futtatása

Az asyncio.run() a megfelelő belépési pont szinte minden alkalmazáshoz. Két Loop metódus létezik azokra az esetekre, amikor nem az.

  • run_until_complete() – egy awaitable-t megadva futtatja a hurkot, amíg az awaitable be nem fejeződik, majd visszaadja annak eredményét. Egyenértékű egyetlen asyncio.run() hívással, a hurok lebontása nélkül.

  • run_forever() – futtatja a hurkot, amíg egy feladaton belülről meg nem hívják a stop()-ot. Nincs felső szintű awaitable; az alkalmazástól elvárt, hogy a run_forever hívása előtt az asyncio.create_task() segítségével beütemezzen mindent, amire szüksége van.

A kísérő metódusok a stop() (a hurok leállításának kérése az aktuális feladat befejezése után) és a close() (a hurok erőforrásainak felszabadítása).

8.13.3. Hurok-oldali feladatlétrehozás

  • create_task() – ugyanaz a művelet, mint az asyncio.create_task(). A szabad függvény azért létezik, hogy az alkalmazáskódnak ne legyen szüksége hurokhivatkozásra a gyakori esethez; a metódus pedig az olyan műszerezéshez létezik, amelynek már van hivatkozása.

8.13.4. Kivételkezelők

A hurok meghív egy kezelőt, amikor egy feladat olyan kivételt vált ki, amelyet a korutin hívási láncában semmi sem kapott el – tipikus eset egy olyan feladat, amelyet az alkalmazás az asyncio.create_task() segítségével hozott létre, és soha nem várt be. Az alapértelmezett kezelő egy traceback-et nyomtat a sys.stderr-en keresztül; a kivételek oldal megmutatta, hogyan lehet egyedire cserélni.

  • set_exception_handler() – egyedi kezelő telepítése. A kezelő egy handler(loop, context) hívható, ahol a context egy dict, amely legalább a 'message'-t tartalmazza, és általában az 'exception'-t és a 'future'-t is.

  • get_exception_handler() – visszaadja a jelenleg telepített kezelőt, vagy None-t, ha az alapértelmezett van használatban.

  • default_exception_handler() – a beépített kezelő. Hasznos egy olyan egyedi kezelőn belül, amely szintén le akarja futtatni az alapértelmezett viselkedést (például naplózni a flash memóriába és traceback-et is nyomtatni).

  • call_exception_handler() – a jelenleg telepített kezelő futtatása egy kézzel összeállított context dict-tel. Többnyire maga a hurok használja; egy alkalmazásnak ritkán van rá szüksége.