2015-12-29 1 views
5

私は2つのオブジェクトを持っていて、それらをループで読みたいと思っています。私はこのようなasyncio.waitを使用しています:asyncio.wait()で行ったコルーチンを知る方法

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

done.pop()は私に最初に終了した未来を与えます。問題は私がどのようにread()操作が完了したかを知ることができないことです。私はtasks変数に[reader.read(1000), freader.read(1000)]を入れて、それらと未来を比較してみました。しかし、これは、未来が元のタスクのどれとも等しくないため、間違っているようです。だからどのコルーチンが完成したのか、私はどのようにして見つけ出すのですか?

+0

あなたの呼び出しからタスクを作成し、それらの*を 'wait'に渡す必要があります。 [この例](https://websockets.readthedocs.org/en/stable/intro.html#both) – jonrsharpe

+0

@jonrsharpe。そうです。ありがとう。それを回答として投稿するように気をつけますか? – Elektito

+0

うれしい、やってよ。 – jonrsharpe

答えて

5

.readコールごとに別々のタスクを作成し、それらのタスクを.waitに渡す必要があります。その後、タスクが結果に含まれているかどうかを確認できます。

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

... 

websocketsのドキュメントのthis example

+1

また、よくある間違いの1つは、 'asyncio.wait'が(通常はコルーチンが取り消されたとき)キャンセルできることを無視することですが、作成するタスク(または作成して渡すもの)**は* *。私は通常、 'asyncio.wait'呼び出しを明示的にタスクをキャンセルする' try'/'finally'でラップしてしまいます。煩わしくて、現時点では貧弱に文書化されています。 – ereOn

関連する問題