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()
View Code

上面运行结果如下:三次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()
View Code

上面运行结果如下:三次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()
View Code

运行结果如下:一共用时间为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')}")
View Code

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

 

 

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

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

 

posted @ 2020-03-01 13:51  flyinghappy  阅读(376)  评论(1)    收藏  举报