等待任何未来的异步

2024-05-23 02:28:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用异步来处理并发的网络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())

通常,按期货排队的顺序等待是可以的:

Well behaved functions profiler graph

蓝色表示每个任务在执行器队列中的时间,即已调用run_in_executor,但函数尚未执行,因为执行器仅同时运行5个任务;绿色表示执行函数本身所花费的时间;红色表示等待所有以前的未来await所花费的时间。

Volatile functions profiler graph

在我的例子中,函数在时间上变化很大,等待队列中的前一个未来等待会浪费很多时间,而我可以在本地处理GET输出。这使得我的系统空闲了一段时间,但当几个输出同时完成时,系统会不知所措,然后跳回到空闲状态,等待更多的请求完成。

有没有办法await在执行者中完成任何未来?


Tags: 数据函数runinloopfor顺序main

热门问题