你的解决办法是可行的,不过我觉得有问题。在async def main():
asyncio.ensure_future(main())
# task finishing
一旦main开始,它就会创建新的任务并立即执行(ensure_future立即创建任务),这与实际完成此任务需要时间不同。我想这可能会导致创建大量的任务,从而耗尽内存。在
除此之外,这意味着任何数量巨大的任务都可以并发运行。它可能会耗尽您的网络吞吐量或可同时打开的套接字数量(想象一下,您要并行下载1000000个URL—不会有什么好结果)。在
在并发世界中,这个问题通常是can be solved,通过使用类似Semaphore之类的方法来限制可以与某个合理值同时运行的东西的数量。但在您的情况下,我认为手动跟踪正在运行的任务量并手动填充它会更方便:
^{pr2}$
输出如下:939 got
816 got
737 got
257 got
528 got
939 processed
816 processed
528 processed
816 dealt
589 got
939 dealt
528 dealt
712 got
263 got
737 processed
257 processed
263 processed
712 processed
263 dealt
712 dealt
386 got
708 got
589 processed
257 dealt
386 processed
708 processed
711 got
711 processed
这里重要的部分是,我们如何在运行的任务数量减少到5个以下之后才使用下一个消息。在
升级版:
是的,如果不需要动态更改max running number,信号量似乎更方便。在sem = asyncio.Semaphore(5)
async def main():
async with sem:
asyncio.ensure_future(main())
await utilize_message()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
try:
asyncio.ensure_future(main())
loop.run_forever()
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()