如何知道使用asyncio.wait()完成了哪些协同程序

时间:2015-12-29 10:59:28

标签: python python-3.x python-asyncio

我有两个StreamReader个对象,想要在循环中读取它们。我正在使用asyncio.wait这样:

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

现在done.pop()为我提供了先完成的未来。问题是我不知道如何找到完成的read()操作。我尝试将[reader.read(1000), freader.read(1000)]放在tasks变量中,并将完成的未来与那些进行比较。但这似乎是不正确的,因为完成的未来不等于原始任务。那么我怎么能找到哪个协程完成了呢?

1 个答案:

答案 0 :(得分:8)

您需要为每个.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