Wie erreicht man mit Pythons Async/Await wirklich „Fire and Forget'?

Patricia Arquette
Freigeben: 2024-11-09 01:38:02
Original
896 Leute haben es durchsucht

How to Truly Achieve

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

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

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

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage