Heim > Backend-Entwicklung > Python-Tutorial > Wie erreicht man das „Fire and Forget'-Verhalten in Async/Await von Python 3.5?

Wie erreicht man das „Fire and Forget'-Verhalten in Async/Await von Python 3.5?

DDD
Freigeben: 2024-11-08 21:52:01
Original
523 Leute haben es durchsucht

How to Achieve

„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())
Nach dem Login kopieren

Ausgabe:

async_foo started
Do some actions 1
async_foo done
Do some actions 2
Do some actions 3
Nach dem Login kopieren

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))
Nach dem Login kopieren

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)
Nach dem Login kopieren
erreicht werden

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage