8.3. Az eseményhurok¶
Az eseményhurok az a motor, amelyet az asyncio a háttérben futtat. Listát vezet a program összes feladatáról, mindegyiket megkéri, hogy fusson a következő await-jéig, majd továbblép a következő készen álló feladatra. Amikor nincs készen álló feladat, vár — maga a várakozás teszi szabaddá a CPU-t, hogy a firmware más dolgokat futtathasson és az energiatakarékos alvások beindulhassanak —, amíg valami, amire egy feladat várt, elérhetővé nem válik, majd folytatja azt a feladatot. Ez ismétlődik a végtelenségig.
A legtöbb alkalmazás soha nem lép közvetlen kapcsolatba a hurokkal. A hurok az asyncio.run() hívásának következménye; az alkalmazás korutinokat ír, feladatként ütemezi őket, a többit pedig a hurok végzi.
8.3.1. Mit csinál valójában az asyncio.run()¶
Egyetlen hívás:
asyncio.run(main())
rövidítése egy hosszabb sorozatnak, amelyet a hurok az alkalmazás nevében kezel:
Létrehozza az eseményhurkot, ha még nem létezik.
A megadott korutint egy feladatba csomagolja, és a hurok felső szintű belépési pontjaként ütemezi.
Futtatja a hurkot — végiglépked a készen álló feladatokon, vár, amikor egyik sem áll készen, folytatja a feladatokat, amikor az await-jeik befejeződnek — amíg a felső szintű feladat vissza nem tér vagy kivételt nem dob.
Megszakítja az alkalmazás által létrehozott, még futó feladatokat.
Visszaadja azt, amit a felső szintű korutin visszaadott (vagy újra dobja, amit az dobott).
8.3.2. Programonként egyetlen hurok¶
A MicroPython asyncio-jának egyetlen eseményhurka van, pont. Nincs új hurok létrehozása, és nincs egy hurok beágyazása egy másikba. Az asyncio.run() meghívása egy olyan korutinból, amely már fut a hurkon, hiba; a hurok már ott van, és a korutinnak csak await-elnie kell azt, amit el akart indítani.
A gyakorlatban a szabály ugyanaz, mint az előző oldal záró sora: programonként pontosan egy asyncio.run() hívás van, legfelül, egyetlen async def main() mögötte. Minden más a main-en belül él.
8.3.3. Közvetlen hurokhozzáférés¶
Azon ritka esetekben, amikor egy alkalmazásnak magához a hurokhoz kell nyúlnia — főleg diagnosztika és kivételkezelők esetén —, az asyncio.get_event_loop() visszaadja a Loop objektumot. Innen az alkalmazás egyéni kivételkezelőt telepíthet, megvizsgálhatja, mit csinál a hurok, vagy (nagyon ritkán) közvetlenül meghívhatja a create_task() metódust az asyncio.create_task() helyett (ugyanaz a művelet).
A Loop által biztosított metódusok teljes készletét — run_forever(), stop(), set_exception_handler() és a többit — a hurokvezérlés oldal tárgyalja később ebben a fejezetben. Addig is az asyncio.run(main()) minden, amire egy alkalmazásnak szüksége van.