Heim > Artikel > Backend-Entwicklung > Wie können Sie „Fire and Forget“ mit Pythons Async/Await implementieren?
Asynchrone Programmierung in Python beinhaltet oft Aufgaben, die keine sofortige Aufmerksamkeit erfordern. Ein Ansatz zur Bewältigung solcher Aufgaben ist die Verwendung des „Fire and Forget“-Musters, das die gleichzeitige Ausführung einer Aufgabe ermöglicht, ohne den Hauptausführungsfluss zu blockieren.
In der Coroutine-Implementierung von Tornado könnte dieses Muster durch Weglassen des Schlüsselworts yield erreicht werden. Ab Python 3.5 erfordert die Async/Await-Syntax jedoch einen anderen Ansatz.
Laut der Python-Dokumentation für asyncio.Task können Coroutinen dies sein wird „im Hintergrund“ ausgeführt, indem asyncio.ensure_future verwendet wird, um eine Aufgabe zu erstellen. Diese Aufgabe wird gleichzeitig ausgeführt, ohne die Funktion zu blockieren.
import asyncio async def async_foo(): print("async_foo started") await asyncio.sleep(1) print("async_foo done") async def main(): asyncio.ensure_future(async_foo()) # fire and forget async_foo() # ... Other code can be executed here ...
Standardmäßig erwartet Asyncio, dass Aufgaben abgeschlossen sind, bevor die Ereignisschleife abgeschlossen ist. Wenn nach Abschluss der Ereignisschleife noch Aufgaben ausgeführt werden, wird eine Warnung ausgegeben. Um diese Warnung zu vermeiden, sollten alle ausstehenden Aufgaben nach Abschluss der Ereignisschleife abgewartet werden.
loop = asyncio.get_event_loop() loop.run_until_complete(main()) # Wait for any remaining tasks pending = asyncio.Task.all_tasks() await asyncio.gather(*pending)
In manchen Fällen müssen Aufgaben möglicherweise abgebrochen statt abgewartet werden. Dies kann mit task.cancel() erfolgen, es muss jedoch abgewartet werden, bis die abgebrochene Aufgabe den Abbruch abgeschlossen hat.
# ... Same code as before ... # Cancel all running tasks pending = asyncio.Task.all_tasks() for task in pending: task.cancel() with suppress(asyncio.CancelledError): await asyncio.wait_for(task, timeout=None)
Das obige ist der detaillierte Inhalt vonWie können Sie „Fire and Forget“ mit Pythons Async/Await implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!