8.13. Upravljanje petljom

Većina asyncio skripti nikada izravno ne dira petlju događaja – asyncio.run() je dovoljan. Ova stranica pokriva sučelje Loop za slučajeve kada nije: instaliranje rukovatelja iznimkama, izvođenje petlje s drugačijim životnim ciklusom od run ili zadržavanje objekta petlje radi instrumentacije.

8.13.1. Dohvaćanje petlje

  • asyncio.get_event_loop() – vraća objekt Loop. Sigurno ga je pozvati iznutra ili izvana korutine.

  • asyncio.new_event_loop() – na MicroPythonu, resetira stanje postojeće petlje umjesto da stvara novu. Napomenu vrijedi ponoviti: postoji točno jedna petlja događaja po programu.

Ne postoji API za izvođenje petlje osim metoda na Loop i asyncio.run().

8.13.2. Izravno izvođenje petlje

asyncio.run() je ispravna ulazna točka za gotovo svaku aplikaciju. Postoje dvije metode Loop za slučajeve kada nije.

  • run_until_complete() – za dani čekljivi objekt izvodi petlju dok taj čekljivi objekt ne završi, zatim vraća njegov rezultat. Ekvivalent jednom pozivu asyncio.run(), bez ukidanja petlje.

  • run_forever() – izvodi petlju dok se stop() ne pozove iz zadatka. Nema čekljivog objekta na vrhu; očekuje se da aplikacija rasporedi sve što joj treba putem asyncio.create_task() prije pozivanja run_forever.

Pripadajuće metode su stop() (zatraži zaustavljanje petlje nakon završetka trenutnog zadatka) i close() (oslobodi resurse petlje).

8.13.3. Stvaranje zadataka na strani petlje

  • create_task() – ista operacija kao asyncio.create_task(). Slobodna funkcija postoji kako kôdu aplikacije ne bi trebala referenca na petlju za uobičajeni slučaj; metoda postoji za instrumentaciju koja je već ima.

8.13.4. Rukovatelji iznimkama

Petlja poziva rukovatelja kada zadatak podigne iznimku koju ništa u lancu poziva korutine nije uhvatilo – tipičan slučaj je zadatak koji je aplikacija stvorila s asyncio.create_task() i nikada nije počekala. Zadani rukovatelj ispisuje trag (traceback) kroz sys.stderr; stranica o iznimkama pokazala je kako ga zamijeniti nečim prilagođenim.

  • set_exception_handler() – instalira prilagođenog rukovatelja. Rukovatelj je pozivljivi objekt handler(loop, context) gdje je context rječnik s barem 'message' i obično 'exception' te 'future'.

  • get_exception_handler() – vraća trenutno instaliranog rukovatelja ili None ako se koristi zadani.

  • default_exception_handler() – ugrađeni rukovatelj. Koristan unutar prilagođenog rukovatelja koji želi također izvesti zadano ponašanje (zapisati u flash memoriju i ispisati trag (traceback), na primjer).

  • call_exception_handler() – izvodi trenutno instaliranog rukovatelja s ručno izgrađenim rječnikom konteksta. Uglavnom ga koristi sama petlja; aplikaciji je rijetko potreban.