Heim > Artikel > Backend-Entwicklung > Wie implementiert man asynchrone „Fire and Forget“-Operationen in Python Async/Await?
In bestimmten Szenarien besteht die Notwendigkeit, einen asynchronen Vorgang zu initiieren, der nicht auf seinen Abschluss warten muss . Traditionell könnte der „Fire and Forget“-Ansatz in den Coroutinen von Tornado durch Weglassen des Schlüsselworts yield erreicht werden.
In der async/await-Syntax von Python 3.5 löst eine solche Implementierung jedoch eine RuntimeWarning aus, die darauf hinweist, dass die Coroutine wurde nie erwartet.
Glücklicherweise bietet die Asyncio-Bibliothek von Python über ihre Klasse asyncio.Task eine Lösung. Dies ermöglicht die Erstellung einer Aufgabe, die im Hintergrund ausgeführt werden kann, ohne die Hauptausführung 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() # continue with other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
Dieser Ansatz stellt sicher, dass async_foo() asynchron ausgeführt wird, während andere Aktionen ohne Wartezeit fortgesetzt werden können.
Es ist wichtig zu beachten, dass Asyncio erwartet, dass alle Aufgaben abgeschlossen sind, wenn die Ereignisschleife abgeschlossen ist. Daher können alle verbleibenden ausstehenden Aufgaben zu Warnungen führen. Um dies zu verhindern, kann man entweder alle ausstehenden Aufgaben abwarten oder sie abbrechen.
Option 1: Auf ausstehende Aufgaben warten
pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
Option 2: Ausstehende Aufgaben abbrechen Aufgaben
pending = asyncio.Task.all_tasks() for task in pending: task.cancel() with suppress(asyncio.CancelledError): loop.run_until_complete(task)
Durch das Abbrechen der Aufgaben werden diese aus dem Zeitplan der Ereignisschleife entfernt, wodurch mögliche Warnungen vermieden werden.
Das obige ist der detaillierte Inhalt vonWie implementiert man asynchrone „Fire and Forget“-Operationen in Python Async/Await?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!