Iteriert über asyncio.coroutine

8

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:

  • Wenn es möglich ist, dies zu tun, wie kann ich das tun?
  • wenn es nicht möglich ist, warum nicht?

Lass es mich wissen, wenn diese Frage nicht klar ist!

    
user2463201 17.05.2014, 09:54
quelle

3 Antworten

5

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:

  1. Es ist zu einfach, ein Durcheinander zu machen

  2. 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:

%Vor%     
Andrew Svetlov 17.05.2014 12:47
quelle
4

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:

%Vor%

Dann könnte Ihr Code wie folgt geschrieben werden:

%Vor%

Informationen zur neuen Syntax und zur Funktionsweise dieses Codes finden Sie unter PEP 492

    
Huazuo Gao 09.09.2015 13:14
quelle
1

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 .

    
Claude 02.09.2015 14:28
quelle