Ich habe in letzter Zeit mit asyncio herumgespielt, und während ich anfange, eine Intuition dafür zu bekommen, wie es funktioniert, gibt es etwas, was ich nicht tun konnte. Ich bin mir nicht sicher, ob es daran liegt, dass ich die Konstruktion falsch verstanden habe, oder ob es einen Grund gibt, warum das, was ich versuche, keinen Sinn ergibt.
Kurz gesagt, ich möchte in der Lage sein, über eine nachgebende asyncio.coroutine zu iterieren. Zum Beispiel möchte ich etwas tun können wie:
%Vor% Dies wirft jedoch eine Ausnahme von den Eingeweiden von asyncio. Ich habe andere Dinge versucht, wie for n in (yield from countdown(5)): ...
, aber das gibt auch eine ähnlich undurchsichtige Laufzeitausnahme.
Ich kann nicht sofort erkennen, warum Sie so etwas nicht tun sollten, aber ich stoße an die Grenzen meiner Fähigkeit zu verstehen, was vor sich geht.
Also:
Lass es mich wissen, wenn diese Frage nicht klar ist!
Bei asyncio-Routinen sollten Sie yield from
und niemals yield
verwenden.
Das ist Absicht. Argument für yield from
sollte nur eine andere Coroutine oder asyncio.Future
Instanz sein.
Aufrufe von coroutine selbst sollten mit yield from
wieder wie yield from countdown(5)
verwendet werden.
Für Ihren Fall empfehle ich Warteschlangen:
%Vor% Nun, Sie können die Werte von countdown
überprüfen, das folgende Beispiel funktioniert. Aber ich denke, es ist Antipattern:
Es ist zu einfach, ein Durcheinander zu machen
Sie können trotzdem countdown
Aufrufe nicht mit itertools
Funktionen erstellen. Ich meine etwas wie sum(countdown(5))
oder itertools.accumulate(countdown(5))
.
Wie auch immer, Beispiel mit dem Mischen von yield
und yield from
in Coroutine:
In Python 3.5 wird die async for
-Syntax eingeführt. Die asynchrone Iteratorfunktionssyntax ist jedoch immer noch nicht vorhanden (d. H.% Co_de% ist in yield
functions verboten). Hier ist ein Workaround:
Dann könnte Ihr Code wie folgt geschrieben werden:
%Vor%Informationen zur neuen Syntax und zur Funktionsweise dieses Codes finden Sie unter PEP 492
Update: Es scheint Python 3.5 unterstützt dies sogar besser nativ :
Mit dem gleichen Problem steckengeblieben (und inspiriert durch den Code in aio-s3 ), ich dachte, es sollte eine elegantere Lösung geben.
%Vor% Begründung: Die countdown
-Methode ergibt Futures, jeder löst sich nach einer 1 Sekunde Schlaf auf die bereitgestellte Zahl auf.
Die Funktion print_countdown
nimmt die erste Zukunft, yield from
-ing es (die bis zur Auflösung pausiert) und das gewünschte Ergebnis: n
.
Tags und Links python python-asyncio python-3.4