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

高洛峰
Freigeben: 2017-03-28 15:28:17
Original
2882 Leute haben es durchsucht

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

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

tasks = [
  asyncio.ensure_future(func1()),
  asyncio.ensure_future(func2())
  ]
loop.run_until_complete(asyncio.wait(tasks))
Nach dem Login kopieren
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.
Nach dem Login kopieren
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()
Nach dem Login kopieren
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()
Nach dem Login kopieren
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!

Verwandte Etiketten:
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage