Python 如何知道使用asyncio.wait()完成了哪些协同路由

Python 如何知道使用asyncio.wait()完成了哪些协同路由,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,我有两个StreamReader对象,希望在循环中读取它们。我使用的是asyncio。等待如下: 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

我有两个
StreamReader
对象,希望在循环中读取它们。我使用的是
asyncio。等待
如下:

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)]
放在
任务
变量中,并将完成的未来与这些任务进行比较。但这似乎是不正确的,因为完成的未来并不等于最初的任务。那么,我应该如何找到完成的协同程序呢?

您需要为每个
创建一个单独的任务。读取
调用,并将这些任务传递给
。等待
。然后可以检查任务在结果中的位置

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
文档。

您需要通过呼叫创建任务,并将这些任务传递给
wait
——参见例如..@jornsharpe Yep。就这样。谢谢想把它作为一个答案吗?很好,可以。另外请注意,一个常见的错误是忽略了
asyncio.wait
可以被取消(通常当包含的协同程序被取消时),但它创建的任务(或您创建并传递的任务)不是。我通常最后会用一个明确取消任务的
try
/
finally
来包装我的
asyncio.wait
调用。现在很烦人,文件记录也很差。