Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Sie „Fire and Forget“ mit Pythons Async/Await implementieren?

Wie können Sie „Fire and Forget“ mit Pythons Async/Await implementieren?

DDD
DDDOriginal
2024-11-09 04:46:02736Durchsuche

How Can You Implement

„Fire and Forget“ mit Python Async/Await

Einführung

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.

„Fire and Forget“ mit Async/Await

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.

asyncio.Task zu „Fire and Forget“

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 ...

Verarbeitung ausstehender Aufgaben

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)

Aufgaben abbrechen

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!

Stellungnahme:
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