一、首先看看普通模式,即没有采用协程的情况。直接看代码和运行结果
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() 来模拟任务时间的时候又没有问题。
哪位大神有知道什么原因,请留言一下!