await for any future asyncio(等待任何未来的异步)
本文介绍了等待任何未来的异步的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用Asyncio来处理并发网络I/O。要在单个点调度非常多的功能,每个功能完成的时间差别很大。然后,将在每个输出的单独进程中处理接收到的数据。
处理数据的顺序无关紧要,因此考虑到输出可能会有很长的等待期,我希望await无论将来先完成什么,而不是按预定义的顺序。
def fetch(x):
sleep()
async def main():
futures = [loop.run_in_executor(None, fetch, x) for x in range(50)]
for f in futures:
await f
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
正常情况下,按期货排队顺序等待即可:
蓝色表示每个任务在Executor队列中的时间,即run_in_executor已调用,但函数尚未执行,因为Executor同时只运行5个任务;绿色表示函数本身执行所花费的时间;红色表示等待所有之前的未来await所花费的时间。
在我的情况下,函数在时间上变化很大,等待队列中的前一个期货等待会浪费很多时间,而我可以在本地处理GET OUTPUT。这会使我的系统空闲一段时间,直到几个输出同时完成时才会不堪重负,然后跳回空闲状态,等待更多请求完成。
是否有办法await无论将来在执行器中首先完成吗?
推荐答案
看起来您正在查找asyncio.wait和return_when=asyncio.FIRST_COMPLETED。
def fetch(x):
sleep()
async def main():
futures = [loop.run_in_executor(None, fetch, x) for x in range(50)]
while futures:
done, futures = await asyncio.wait(futures,
loop=loop, return_when=asyncio.FIRST_COMPLETED)
for f in done:
await f
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
这篇关于等待任何未来的异步的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:等待任何未来的异步
基础教程推荐
猜你喜欢
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- matplotlib 设置 yaxis 标签大小 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
- Kivy 使用 opencv.调整图像大小 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
