我试图使用异步来处理并发的网络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())
通常,按期货排队的顺序等待是可以的:
蓝色表示每个任务在执行器队列中的时间,即已调用run_in_executor
,但函数尚未执行,因为执行器仅同时运行5个任务;绿色表示执行函数本身所花费的时间;红色表示等待所有以前的未来await
所花费的时间。
在我的例子中,函数在时间上变化很大,等待队列中的前一个未来等待会浪费很多时间,而我可以在本地处理GET输出。这使得我的系统空闲了一段时间,但当几个输出同时完成时,系统会不知所措,然后跳回到空闲状态,等待更多的请求完成。
有没有办法await
在执行者中完成任何未来?
目前没有回答
相关问题 更多 >
编程相关推荐