„Fire and Forget“ Python Async/Await
Bei der asynchronen Programmierung kann es nützlich sein, unkritische Vorgänge auszuführen, ohne darauf zu warten deren Vollendung. In Tornado kann dieses „Fire and Forget“-Verhalten erreicht werden, indem das Schlüsselwort yield in einer Coroutine weggelassen wird. In der async/await-Syntax von Python 3.5 führt dieser Ansatz jedoch zu einer Laufzeitwarnung und der Nichtausführung des gewünschten Vorgangs.
Lösung: asyncio.Task
Laut Pythons Dokumentation für asyncio.Task ermöglicht es die Ausführung einer Coroutine „im Hintergrund“. Durch die Verwendung von asyncio.ensure_future zum Erzeugen einer Aufgabe wird die Ausführung nicht blockiert und die Funktion kehrt sofort zurück, ähnlich dem „Fire and Forget“-Verhalten.
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() # Perform other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
Ausgabe:
async_foo started Do some actions 1 async_foo done Do some actions 2 Do some actions 3
Umgang mit ausstehenden Aufgaben
Wenn Aufgaben nach Abschluss der Ereignisschleife noch ausgeführt werden, wird eine Warnung angezeigt angezeigt werden. Um dies zu verhindern, können alle ausstehenden Aufgaben abgewartet werden, sobald die Ereignisschleife beendet ist:
# Let's also finish all running tasks: pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
Aufgaben abbrechen
In manchen Fällen kann es notwendig sein, Aufgaben abzubrechen deren Fertigstellung voraussichtlich nicht zu erwarten ist. Dies kann mit task.cancel():
# Let's also cancel all running tasks: pending = asyncio.Task.all_tasks() for task in pending: task.cancel() # Now we should await task to execute it's cancellation. # Cancelled task raises asyncio.CancelledError that we can suppress: with suppress(asyncio.CancelledError): loop.run_until_complete(task)
Das obige ist der detaillierte Inhalt vonWie erreicht man das „Fire and Forget'-Verhalten in Async/Await von Python 3.5?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!