8.13. Lusbesturing¶
De meeste asyncio-scripts raken de event loop nooit rechtstreeks aan – asyncio.run() volstaat. Deze pagina behandelt het Loop-oppervlak voor de gevallen waarin dat niet zo is: het installeren van een uitzonderingshandler, het draaien van de loop met een andere levenscyclus dan run, of het vasthouden van het loop-object voor instrumentatie.
8.13.1. De loop verkrijgen¶
asyncio.get_event_loop()– geeft hetLoop-object terug. Veilig aan te roepen van binnen of buiten een coroutine.asyncio.new_event_loop()– op MicroPython reset dit de status van de bestaande loop in plaats van een nieuwe te maken. De opmerking is het herhalen waard: er is precies één event loop per programma.
Er is geen API om de loop te draaien, anders dan de methoden op Loop en asyncio.run().
8.13.2. De loop rechtstreeks draaien¶
asyncio.run() is het juiste startpunt voor vrijwel elke applicatie. Voor de gevallen waarin dat niet zo is, bestaan er twee Loop-methoden.
run_until_complete()– gegeven een awaitable, draait de loop totdat die awaitable klaar is en geeft dan het resultaat terug. Gelijkwaardig aan een enkeleasyncio.run()-aanroep, zonder de afbouw van de loop.run_forever()– draait de loop totdatstop()van binnen een taak wordt aangeroepen. Geen awaitable op het hoogste niveau; van de applicatie wordt verwacht dat ze alles wat nodig is viaasyncio.create_task()inplant voordatrun_foreverwordt aangeroepen.
De begeleidende methoden zijn stop() (verzoek de loop te stoppen nadat de huidige taak klaar is) en close() (geef de bronnen van de loop vrij).
8.13.3. Taakaanmaak aan de loop-zijde¶
create_task()– dezelfde bewerking alsasyncio.create_task(). De vrije functie bestaat zodat applicatiecode voor het gangbare geval geen loop-referentie nodig heeft; de methode bestaat voor instrumentatie die er al een heeft.
8.13.4. Uitzonderingshandlers¶
De loop roept een handler aan wanneer een taak een uitzondering opwerpt die niets in de aanroepketen van de coroutine heeft opgevangen – een typisch geval is een taak die de applicatie met asyncio.create_task() heeft aangemaakt en nooit heeft geawait. De standaardhandler print een traceback via sys.stderr; de pagina uitzonderingen liet zien hoe je deze kunt vervangen door iets eigens.
set_exception_handler()– installeer een eigen handler. De handler is een aanroepbarehandler(loop, context)waarbijcontexteen dict is met ten minste'message'en doorgaans'exception'en'future'.get_exception_handler()– geeft de momenteel geïnstalleerde handler terug, ofNoneals de standaard in gebruik is.default_exception_handler()– de ingebouwde handler. Nuttig binnen een eigen handler die ook het standaardgedrag wil uitvoeren (bijvoorbeeld naar flashgeheugen loggen én een traceback printen).call_exception_handler()– draait de momenteel geïnstalleerde handler met een zelf samengestelde context-dict. Wordt voornamelijk door de loop zelf gebruikt; een applicatie heeft het zelden nodig.