python并发循环_如何使用asyncio并发运行无限循环?

你的解决办法是可行的,不过我觉得有问题。在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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值