python asyncio和celery对比_Python学习笔记--协程asyncio(不同情况下的性能效果实验)...

一、首先看看普通模式,即没有采用协程的情况。直接看代码和运行结果

1 deftaskfun(num):2 print(f"taskfun start at {time.strftime('%X')}")3 sum=04 for i inrange(num):5 sum=sum+i6 print('执行结果'+str(num))7 print(f"taskfun finished at {time.strftime('%X')}")8 defno_async_main():9 print(f"main start at {time.strftime('%X')}")10 taskfun(999999)11 taskfun(9999999)12 taskfun(99999999)13 print(f"main finished at {time.strftime('%X')}")14

15 if __name__ == '__main__':16 no_async_main()

View Code

上面运行结果如下:三次taskfun函数运行时间分别小于1秒,约2秒,约22秒,一共用时间约24秒

二、下面看采用协程的情况,代码和运行结果

1 async deftaskfun(num):2 print(f"taskfun start at {time.strftime('%X')}")3 sum=04 for i inrange(num):5 sum=sum+i6 print('执行结果'+str(num))7 print(f"taskfun finished at {time.strftime('%X')}")8

9 async defmainfun():10 task1=asyncio.create_task(taskfun(999999))11 task2=asyncio.create_task(taskfun(9999999))12 task3=asyncio.create_task(taskfun(99999999))13 await task114 await task215 await task316

17 defasync_main():18 print(f"main start at {time.strftime('%X')}")19 asyncio.run(mainfun())20 print(f"main finished at {time.strftime('%X')}")21

22 if __name__ == '__main__':23 async_main()

View Code

上面运行结果如下:三次taskfun函数运行时间分别小于1秒,约2秒,约19秒,一共用时间约22秒

以上两个结果好像是节省了约2秒时间。例子不鲜明好像,那我们把taskfun中的num数字都用8个9来试试。

只贴结果如下:左侧是普通的情况的结果,右侧的是用协程的结果。分别中用时间75秒和70秒。协程好像没什么效果啊!测试了几次都差不多结果!

          

三、换taskfun函数的功能,换成读写文件,先看普通的情况。

1 deftaskfun_readfile(filename):2 print(f"taskfun start at {time.strftime('%X')}")3 with open(filename,'r') as f:4 infolist=f.read()5 f.close()6 #读取的数据再写入进去

7 with open(filename,'w') as f:8 f.write(infolist)9 f.close()10 print(f"taskfun end at {time.strftime('%X')}")11 defno_async_main():12 print(f"main start at {time.strftime('%X')}")13 taskfun_readfile('test.json')14 taskfun_readfile('test.json')15 taskfun_readfile('test.json')16 print(f"main finished at {time.strftime('%X')}")17

18 if __name__ == '__main__':19 no_async_main()

View Code

运行结果如下:一共用时间为19秒,每运行一次taskfun时间分别为5、6、8秒。

四、换taskfun函数的功能,换成读写文件,看看协程的情况。

1 async deftaskfun_readfile(filename):2 print(f"taskfun start at {time.strftime('%X')}")3 with open(filename,'r') as f:4 infolist=f.read()5 f.close()6 #读取的数据再写入进去

7 with open(filename,'w') as f:8 f.write(infolist)9 f.close()10 print(f"taskfun end at {time.strftime('%X')}")11

12 async defmainfun():13 task1=asyncio.create_task(taskfun_readfile('test.json'))14 task2=asyncio.create_task(taskfun_readfile('test.json'))15 task3=asyncio.create_task(taskfun_readfile('test.json'))16 await task117 await task218 await task319

20 defasync_main():21 print(f"main start at {time.strftime('%X')}")22 asyncio.run(mainfun())23 print(f"main finished at {time.strftime('%X')}")

View Code

运行结果如下:一共用了24秒时间,噢!什么情况!改成读写三个不同的文件也是一样的情况!!!

这是我在实际应用中的疑惑,但是参考网络上文章里面用asyncio.sleep() 来模拟任务时间的时候又没有问题。

哪位大神有知道什么原因,请留言一下!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`asyncio` 和 `Celery` 都是 Python 中用于异步编程的工具,但它们在用途和设计上有所不同。 **asyncio(异步I/O):** - 异步IO库,它是 Python 标准库的一部分,主要侧重于单线程并发处理,适合于 I/O 密集型任务,比如网络请求、文件读写等。通过使用异步/await语法,`asyncio`可以让代码顺序执行,但底层会利用事件循环和回调来管理多个任务并发执行,提高程序响应速度。 - 异步IO适合于对实时性要求较高的场景,例如实时聊天应用或Web服务器。 - asyncio 任务通常是由程序自己启动和管理的。 **Celery:** - 是一个分布式任务队列系统,它基于消息传递模型,能够将耗时的、复杂的、可能需要跨多个机器的任务异步地添加到队列中。Celery 支持多种消息队列如RabbitMQ、Redis等。 - 它的核心是将工作分解为可独立执行的单元,并通过工人(worker)在后台执行这些任务。这使得开发者可以专注于业务逻辑,而无需担心任务调度和失败处理。 - Celery 提供了丰富的错误处理和监控工具,以及跨语言支持,可以与其他语言的消费者进行交互。 - 适用于需要高可用性和可靠性的场景,比如批量数据处理、邮件发送、爬虫等。 **区别总结:** 1. asyncio 主要是针对单机、本地的、轻量级的异步编程,而 Celery 更关注分布式任务的管理和执行。 2. asyncio 更注重单个应用程序内部的并发优化,Celery 则是解决跨进程、跨主机的异步任务分发。 3. 使用 asyncio,程序员需要自行管理任务的调度和错误处理,Celery 提供了更完整的任务管理解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值