当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何知道使用asyncio.wait()完成了哪些协同程序》经验,为你挑选了1个好方法。

我有两个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> jonrsharpe..:

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


另请注意,一个常见的错误是忽略可以取消`asyncio.wait`(通常在取消包含协程时)但是它创建的任务(或者你创建和传递的任务)**不是**.我通常最终用`try` /`finally`包装我的`asyncio.wait`调用,它们明确地取消了任务.目前令人讨厌并且记录不清.
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有