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 objektLoop. 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 pozivuasyncio.run(), bez ukidanja petlje.run_forever()– izvodi petlju dok sestop()ne pozove iz zadatka. Nema čekljivog objekta na vrhu; očekuje se da aplikacija rasporedi sve što joj treba putemasyncio.create_task()prije pozivanjarun_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 kaoasyncio.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 objekthandler(loop, context)gdje jecontextrječnik s barem'message'i obično'exception'te'future'.get_exception_handler()– vraća trenutno instaliranog rukovatelja iliNoneako 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.