Heim >Backend-Entwicklung >Python-Tutorial >Wie implementiert man asynchrone „Fire and Forget'-Operationen in Python Async/Await?

Wie implementiert man asynchrone „Fire and Forget'-Operationen in Python Async/Await?

Barbara Streisand
Barbara StreisandOriginal
2024-11-09 01:08:02280Durchsuche

How to Implement

„Fire and Forget“ 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.

Asyncio.Task: Die Lösung

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.

Umgang mit ausstehenden Aufgaben

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!

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