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