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 aLoopobjektumot. 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ű egyetlenasyncio.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 astop()-ot. Nincs felső szintű awaitable; az alkalmazástól elvárt, hogy arun_foreverhívása előtt azasyncio.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 azasyncio.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ő egyhandler(loop, context)hívható, ahol acontextegy 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, vagyNone-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.