Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erklärung zur Verwendung von Coroutine-Objekten und Future-Objekten in Asyncio
asyncio ist eine in Python Version 3.4 eingeführte Standardbibliothek mit integrierter Unterstützung für asynchrone E/A. Das Programmiermodell von asyncio ist eine NachrichtenSchleife. Heute werden wir ausführlich die Beziehung zwischen Coroutine und Futureasynchronen Objekten
">
Coroutine und Future
Es scheint, dass beides der Fall ist Das Gleiche gilt, da die folgende Syntax verwendet werden kann, um Ergebnisse asynchron zu erhalten:
result = await future result = await coroutine
Tatsächlich ist Coroutine eine GeneratorFunktion, die von abgerufen werden kann Der Vorteil der Verwendung von Coroutine besteht darin, dass wir die Ausführung einer Funktion später fortsetzen können. Wenn es sich beispielsweise um Netzwerkoperationen handelt, können wir dies tun Wechseln Sie zu anderen Aufgaben, um die Ausführung fortzusetzen.
Und Future ist eher ein Promise-Objekt in Javascript. Es ist ein Platzhalter, dessen Wert in der Zukunft geändert wird Wenn wir beispielsweise auf den Abschluss der Netzwerk-E/A-Funktion warten, gibt uns die Funktion einen Container, und das Versprechen füllt den Container, wenn er abgeschlossen ist, und wir können die Rückruffunktion verwenden die tatsächlichen Ergebnisse.
Task-Objekt ist eine Unterklasse von Future, die Coroutine und Future verbindet und Coroutine in ein Future-Objekt kapselt. Im Allgemeinen werden zwei Arten von Tasks gestartet ,tasks = asyncio.gather( asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ) loop.run_until_complete(tasks)und
tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop.run_until_complete(asyncio.wait(tasks))stellen sicher, dass asyncio.gather einige Futures und Coroutinen in eine Zukunft kapseln kann run_until_complete kann entweder ein Future-Objekt oder ein Coroutine-Objekt empfangen
Der richtige
ExitBaseEventLoop.run_until_complete(future) Run until the Future is done. If the argument is a coroutine object, it is wrapped by ensure_future(). Return the Future's result, or raise its exception.Weg der Task-AufgabeAufgabe wurde zerstört, steht aber noch aus!
Aufgabe:
event
-Schleife eine CancelledError-Ausnahme aus. Die Verwendung von Future.cancelled() gibt nicht sofort True zurück (wird verwendet, um das Ende der Aufgabe anzuzeigen. Sie gilt erst dann als abgebrochen, wenn die oben genannte Ausnahme verarbeitet wurde und die Aufgabe endet).Um die Aufgabe zu beenden, können Sie mit
alle Aufgaben finden und abbrechen.
for task in asyncio.Task.all_tasks(): task.cancel()Strg-C stoppt jedoch auch die Ereignisschleife, daher ist es notwendig, die Ereignisschleife neu zu starten.
Es ist notwendig, Ausnahmen in jeder Aufgabe abzufangen Natürlich können Sie
try: loop.run_until_complete(tasks) except KeyboardInterrupt as e: for task in asyncio.Task.all_tasks(): task.cancel() loop.run_forever() # restart loop finally: loop.close()asyncio.gather(..., return_ceptions=True)Ausnahmen in normale Ergebnisse umwandeln und diese zurückgeben.
Das obige ist der detaillierte Inhalt vonAusführliche Erklärung zur Verwendung von Coroutine-Objekten und Future-Objekten in Asyncio. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!