我有两个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
变量并将完成的未来与那些进行比较.但这似乎是不正确的,因为完成的未来不等于原始任务.那么我怎么能找到哪个协程完成了呢?
您需要为每个.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
文档.