„Fire and Forget“ mit Pythons Async/Await
In der Async/Await-Syntax von Python ist das Ausführen einer asynchronen Funktion, ohne darauf zu warten, nicht möglich. Damit wird nicht der gewünschte „Fire and Forget“-Effekt erzielt. Stattdessen wird das Programm mit einer Laufzeitwarnung beendet.
asyncio.Task für „Fire and Forget“
Um „Fire and Forget“ in Asyncio zu implementieren, verwenden Sie asyncio. Aufgabe zum Erstellen einer Aufgabe, die den gewünschten Vorgang im Hintergrund ausführt. Durch den Aufruf von asyncio.ensure_future(async_foo()) wird die mit async_foo() verknüpfte Aufgabe gestartet und wartet nicht auf ihren Abschluss. Dies ist ein einfacher, aber effektiver Ansatz für asynchrone Vorgänge, die nicht explizit abgewartet werden müssen.
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()
Ausstehende Aufgaben abschließen
Beachten Sie, dass Aufgaben, die mit Asyncio erstellt wurden. Es wird erwartet, dass die Aufgabe abgeschlossen ist, bevor die Ereignisschleife abgeschlossen ist. Sollten weiterhin Aufgaben ausstehen, wird eine Warnung generiert. Um dies zu verhindern, warten Sie explizit auf alle ausstehenden Aufgaben, sobald die Ereignisschleife abgeschlossen ist.
async def main(): asyncio.ensure_future(async_foo()) # Fire and forget async_foo() loop = asyncio.get_event_loop() await asyncio.gather(*asyncio.Task.all_tasks())
Aufgaben abbrechen statt warten
Alternativ, wenn Sie das nicht möchten Wenn Sie auf bestimmte Aufgaben auf unbestimmte Zeit warten, können Sie sie abbrechen:
async def echo_forever(): while True: print("Echo") await asyncio.sleep(1) async def main(): asyncio.ensure_future(echo_forever()) # Fire and forget echo_forever() loop = asyncio.get_event_loop() for task in asyncio.Task.all_tasks(): task.cancel() with suppress(asyncio.CancelledError): await task
Das obige ist der detaillierte Inhalt vonWie erreicht man mit Pythons Async/Await wirklich „Fire and Forget'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!