Python asyncio: Leser-Callback und Coroutine-Kommunikation

9

Ich versuche eine einfache Idee zu implementieren, eine Daten von stdin an eine Coroutine zu übergeben:

%Vor%

Dieser Code funktioniert gut, aber eine vereinfachte Version davon mit einer Variablen anstelle eines Event -Objekts funktioniert auch:

%Vor%

Meine Fragen sind: ist der Ansatz mit Event korrekt? Oder gibt es einen besseren Weg mit anderen asyncio-Objekten, um diese Art von Problem zu lösen? Dann, wenn der Ansatz mit Event in Ordnung ist, ist die Verwendung einer Variablen auch in Ordnung?

Danke.

    
Zaur Nasibov 06.04.2015, 16:12
quelle

2 Antworten

13

Ich denke, asyncio.Queue ist für diese Art viel besser geeignet Erzeuger / Verbraucher-Beziehung:

%Vor%

Es ist weniger Logik als mit einem Event , das Sie sicherstellen müssen, dass Sie richtig setzen / entsperren, und es gibt keine Notwendigkeit für ein sleep , aufwachen, überprüfen, zurück in den Ruhezustand, Schleife, wie mit dem Globale Variable. Der Queue -Ansatz ist also einfacher, kleiner und blockiert die Ereignisschleife weniger als Ihre anderen möglichen Lösungen. Die anderen Lösungen sind technisch korrekt , da sie richtig funktionieren (solange Sie keine yield from Aufrufe innerhalb einfügen, wenn if event.is_set() und if data is not None: Blöcke). Sie sind nur ein bisschen klobig.

    
dano 06.04.2015, 16:24
quelle
2

Wenn Sie auf ein Ereignis warten möchten, sollten Sie wahrscheinlich % verwenden. co_de% statt polling Event.wait .

%Vor%     
Ry︁ 06.04.2015 16:16
quelle