2015-12-29 20 views
5

Ich habe zwei StreamReader Objekte und möchte von ihnen in einer Schleife lesen. Ich verwende asyncio.wait wie folgt aus:Wie Sie wissen, welche Coroutinen wurden mit asyncio.wait()

done, pending = await asyncio.wait(
    [reader.read(1000), freader.read(1000)], 
    return_when=asyncio.FIRST_COMPLETED) 

Jetzt done.pop() gibt mir die Zukunft, die zuerst fertig. Das Problem ist, ich weiß nicht, wie man die Operation read() abgeschlossen findet. Ich habe versucht [reader.read(1000), freader.read(1000)] in eine tasks Variable zu setzen und die fertige Zukunft mit diesen zu vergleichen. Dies scheint jedoch falsch zu sein, da die fertig gestellte Zukunft keiner der ursprünglichen Aufgaben entspricht. Wie soll ich herausfinden, welche Coroutine fertig war?

+0

Sie müssen Aufgaben von Ihren Anrufen erstellen und * diese * an 'wait' übergeben - siehe z. [dieses Beispiel] (https://websockets.readthedocs.org/en/stable/intro.html#both). – jonrsharpe

+0

@jonrsharpe Ja. Das tut es. Vielen Dank. Möchten Sie das als Antwort posten? – Elektito

+0

Jolly gut, werde ich tun. – jonrsharpe

Antwort

5

Sie müssen für jeden .read-Aufruf eine separate Aufgabe erstellen und diese Aufgaben an .wait übergeben. Sie können dann überprüfen, wo die Aufgaben in den Ergebnissen sind.

reader_task = asyncio.ensure_future(reader.read(1000)) 
... 

done, pending = await asyncio.wait(
    [reader_task, ...], 
    return_when=asyncio.FIRST_COMPLETED, 
) 

if reader_task in done: 
    ... 

... 

Siehe z.B. this example aus der websockets Dokumentation.

+1

Beachten Sie auch, dass ein häufiger Fehler darin besteht, zu ignorieren, dass 'asyncio.wait' abgebrochen werden kann (normalerweise, wenn die enthaltende Coroutine abgebrochen wird), aber dass die Aufgaben, die er erstellt (oder die Sie erstellen und weitergeben) ** nicht * sind *. Normalerweise schließe ich meine 'asyncio.wait'-Aufrufe mit einem' try'/'finally' ab, der die Aufgaben explizit abbricht. Ärgerlich und schlecht dokumentiert im Moment. – ereOn

Verwandte Themen