我正在尝试使用 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())
通常,按照 future 排队的顺序等待就可以了:
蓝色代表每个任务在执行器队列中的时间,即run_in_executor
已被调用,但该函数尚未执行,因为执行器仅同时运行 5 个任务;绿色是执行函数本身所花费的时间;红色是等待所有之前的 future 所花费的时间await
.
在我的情况下,函数在时间上变化很大,在等待队列中的先前 future 等待时会损失大量时间,而我可以在本地处理 GET 输出。这使得我的系统空闲一段时间,只有在多个输出同时完成时才会被淹没,然后跳回空闲状态等待更多请求完成。
有没有办法await
无论什么 future 首先在执行器中完成?
看起来您正在寻找异步等待 with 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())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)