8.13. Schleifensteuerung#
Die meisten asyncio-Skripte greifen nie direkt auf die Ereignisschleife zu – asyncio.run() genügt. Diese Seite behandelt die Loop-Schnittstelle für die Fälle, in denen das nicht ausreicht: das Installieren eines Ausnahmehandlers, das Ausführen der Schleife mit einem anderen Lebenszyklus als run oder das Festhalten des Schleifenobjekts zu Instrumentierungszwecken.
8.13.1. Die Schleife abrufen#
asyncio.get_event_loop()– gibt dasLoop-Objekt zurück. Kann sicher von innerhalb oder außerhalb einer Koroutine aufgerufen werden.asyncio.new_event_loop()– setzt in MicroPython den Zustand der bestehenden Schleife zurück, anstatt eine neue zu erzeugen. Der Hinweis sei wiederholt: Es gibt genau eine Ereignisschleife pro Programm.
Es gibt keine API zum Ausführen der Schleife außer den Methoden von Loop und asyncio.run().
8.13.2. Die Schleife direkt ausführen#
asyncio.run() ist der richtige Einstiegspunkt für nahezu jede Anwendung. Für die Fälle, in denen das nicht zutrifft, existieren zwei Loop-Methoden.
run_until_complete()– führt bei einem gegebenen Awaitable die Schleife aus, bis dieses Awaitable abgeschlossen ist, und gibt dann sein Ergebnis zurück. Entspricht einem einzelnenasyncio.run()-Aufruf, jedoch ohne den Abbau der Schleife.run_forever()– führt die Schleife aus, bisstop()aus einem Task heraus aufgerufen wird. Kein Top-Level-Awaitable; von der Anwendung wird erwartet, dass sie vor dem Aufruf vonrun_foreverüberasyncio.create_task()einplant, was immer sie benötigt.
Die zugehörigen Methoden sind stop() (fordert das Anhalten der Schleife nach Abschluss des aktuellen Tasks an) und close() (gibt die Ressourcen der Schleife frei).
8.13.3. Task-Erstellung auf Schleifenseite#
create_task()– dieselbe Operation wieasyncio.create_task(). Die freie Funktion existiert, damit Anwendungscode für den häufigen Fall keine Schleifenreferenz benötigt; die Methode existiert für Instrumentierung, die bereits über eine solche verfügt.
8.13.4. Ausnahmehandler#
Die Schleife ruft einen Handler auf, wenn ein Task eine Ausnahme auslöst, die nichts in der Koroutinen-Aufrufkette abgefangen hat – ein typischer Fall ist ein Task, den die Anwendung mit asyncio.create_task() erzeugt und nie awaitet hat. Der Standard-Handler gibt einen Traceback über sys.stderr aus; die Seite Ausnahmen hat gezeigt, wie man ihn durch einen eigenen ersetzt.
set_exception_handler()– installiert einen eigenen Handler. Der Handler ist ein Callablehandler(loop, context), wobeicontextein Dict ist, das mindestens'message'und üblicherweise'exception'und'future'enthält.get_exception_handler()– gibt den aktuell installierten Handler zurück, oderNone, wenn der Standard verwendet wird.default_exception_handler()– der eingebaute Handler. Nützlich innerhalb eines eigenen Handlers, der zusätzlich das Standardverhalten ausführen möchte (zum Beispiel ins Flash protokollieren und einen Traceback ausgeben).call_exception_handler()– führt den aktuell installierten Handler mit einem von Hand erstellten Kontext-Dict aus. Wird meist von der Schleife selbst verwendet; eine Anwendung benötigt es selten.