8.13. Loopkontroll#
De flesta asyncio-skript rör aldrig händelseloopen direkt – asyncio.run() räcker. Den här sidan täcker Loop-gränssnittet för de fall där det inte räcker: att installera en undantagshanterare, köra loopen med en annan livscykel än run, eller behålla loopobjektet för instrumentering.
8.13.1. Att hämta loopen#
asyncio.get_event_loop()– returnerarLoop-objektet. Säkert att anropa både inifrån och utanför en coroutine.asyncio.new_event_loop()– på MicroPython återställer den befintliga loopens tillstånd snarare än att skapa en ny. Anmärkningen tål att upprepas: det finns exakt en händelseloop per program.
Det finns inget API för att köra loopen annat än metoderna på Loop och asyncio.run().
8.13.2. Att köra loopen direkt#
asyncio.run() är rätt ingångspunkt för nästan varje applikation. Två Loop-metoder finns för de fall där den inte är det.
run_until_complete()– givet en inväntbar, kör loopen tills den inväntbara är klar och returnera sedan dess resultat. Motsvarar ett enda anrop tillasyncio.run(), men utan att loopen rivs ned.run_forever()– kör loopen tillsstop()anropas inifrån en uppgift. Ingen inväntbar på toppnivå; applikationen förväntas schemalägga vad den än behöver viaasyncio.create_task()innanrun_foreveranropas.
Kompletterande metoder är stop() (begär att loopen stoppar efter att den aktuella uppgiften är klar) och close() (frigör loopens resurser).
8.13.3. Uppgiftsskapande på loop-sidan#
create_task()– samma operation somasyncio.create_task(). Den fristående funktionen finns så att applikationskod inte behöver en loopreferens i det vanliga fallet; metoden finns för instrumentering som redan har en.
8.13.4. Undantagshanterare#
Loopen anropar en hanterare när en uppgift höjer ett undantag som inget i coroutinens anropskedja har fångat – ett typiskt fall är en uppgift som applikationen skapade med asyncio.create_task() och aldrig inväntade. Standardhanteraren skriver ut en spårning via sys.stderr; sidan om undantag visade hur man byter ut den mot något anpassat.
set_exception_handler()– installera en anpassad hanterare. Hanteraren är ett anropbarthandler(loop, context)därcontextär en dict med åtminstone'message'och vanligtvis'exception'och'future'.get_exception_handler()– returnerar den för närvarande installerade hanteraren, ellerNoneom standardhanteraren används.default_exception_handler()– den inbyggda hanteraren. Användbar inuti en anpassad hanterare som vill köra även standardbeteendet (logga till flashminne och skriva ut en spårning, till exempel).call_exception_handler()– kör den för närvarande installerade hanteraren med en handbyggd context-dict. Används mestadels av loopen själv; en applikation behöver den sällan.