Python学习笔记--协程asyncio(不同情况下的性能效果实验)
一、首先看看普通模式,即没有采用协程的情况。直接看代码和运行结果
1 def taskfun(num): 2 print(f"taskfun start at {time.strftime('%X')}") 3 sum=0 4 for i in range(num): 5 sum=sum+i 6 print('执行结果'+str(num)) 7 print(f"taskfun finished at {time.strftime('%X')}") 8 def no_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()
上面运行结果如下:三次taskfun函数运行时间分别小于1秒,约2秒,约22秒,一共用时间约24秒

二、下面看采用协程的情况,代码和运行结果
1 async def taskfun(num): 2 print(f"taskfun start at {time.strftime('%X')}") 3 sum=0 4 for i in range(num): 5 sum=sum+i 6 print('执行结果'+str(num)) 7 print(f"taskfun finished at {time.strftime('%X')}") 8 9 async def mainfun(): 10 task1=asyncio.create_task(taskfun(999999)) 11 task2=asyncio.create_task(taskfun(9999999)) 12 task3=asyncio.create_task(taskfun(99999999)) 13 await task1 14 await task2 15 await task3 16 17 def async_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()
上面运行结果如下:三次taskfun函数运行时间分别小于1秒,约2秒,约19秒,一共用时间约22秒

以上两个结果好像是节省了约2秒时间。例子不鲜明好像,那我们把taskfun中的num数字都用8个9来试试。
只贴结果如下:左侧是普通的情况的结果,右侧的是用协程的结果。分别中用时间75秒和70秒。协程好像没什么效果啊!测试了几次都差不多结果!

三、换taskfun函数的功能,换成读写文件,先看普通的情况。
1 def taskfun_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 def no_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()
运行结果如下:一共用时间为19秒,每运行一次taskfun时间分别为5、6、8秒。

四、换taskfun函数的功能,换成读写文件,看看协程的情况。
1 async def taskfun_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 def mainfun(): 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 task1 17 await task2 18 await task3 19 20 def async_main(): 21 print(f"main start at {time.strftime('%X')}") 22 asyncio.run(mainfun()) 23 print(f"main finished at {time.strftime('%X')}")
运行结果如下:一共用了24秒时间,噢!什么情况!改成读写三个不同的文件也是一样的情况!!!

这是我在实际应用中的疑惑,但是参考网络上文章里面用asyncio.sleep() 来模拟任务时间的时候又没有问题。
哪位大神有知道什么原因,请留言一下!

浙公网安备 33010602011771号