Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erklärung zur Verwendung von Coroutine-Objekten und Future-Objekten in Asyncio

Ausführliche Erklärung zur Verwendung von Coroutine-Objekten und Future-Objekten in Asyncio

高洛峰
高洛峰Original
2017-03-28 15:28:172933Durchsuche

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

Exit
BaseEventLoop.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-Aufgabe

In der Asyncio-Task-Schleife, wenn Sie Verwenden Sie zum Beenden STRG-C. Auch wenn die Ausnahme abgefangen wird, meldet die Aufgabe in der Ereignisschleife einen Fehler und der folgende Fehler wird angezeigt:

Aufgabe wurde zerstört, steht aber noch aus!

Aufgabe: wait_

for

=> ;
Laut der offiziellen Dokumentation gilt das Task-Objekt nur in den folgenden Situationen als beendet:

ein Ergebnis/eine Ausnahme ist verfügbar oder die Zukunft wurde abgebrochen

Das Der Abbruch des Aufgabenobjekts unterscheidet sich geringfügig von seiner übergeordneten Klasse Future. Wenn Task.cancel() aufgerufen wird, löst die entsprechende Coroutine in der nächsten Runde der

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!

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