异步
普通程序执行
import time def tt(): return time.asctime( time.localtime(time.time()) ) def slow_operation(n): time.sleep(5) print('slow operation_{}_complete'.format(n)) print('每个子过程',tt()) def main(): print('start',tt()) a = [slow_operation(1),slow_operation(2),slow_operation(3)] print('end',tt()) main()
输出结果:
start Thu Nov 26 11:43:11 2020
slow operation_1_complete
每个子过程 Thu Nov 26 11:43:16 2020
slow operation_2_complete
每个子过程 Thu Nov 26 11:43:21 2020
slow operation_3_complete
每个子过程 Thu Nov 26 11:43:26 2020
end Thu Nov 26 11:43:26 2020
三个函数是依次执行的,每个子过程相隔5秒
异步执行
import asyncio import time def tt(): return time.asctime( time.localtime(time.time()) ) async def slow_operation(n): await asyncio.sleep(5) print('slow operation_{}_complete'.format(n)) print('每个子过程',tt()) async def main(): print('start',tt()) await asyncio.wait([slow_operation(1), slow_operation(2), slow_operation(3)]) print('end',tt()) loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()
执行结果:
start Thu Nov 26 11:49:42 2020
slow operation_2_complete
每个子过程 Thu Nov 26 11:49:47 2020
slow operation_1_complete
每个子过程 Thu Nov 26 11:49:47 2020
slow operation_3_complete
每个子过程 Thu Nov 26 11:49:47 2020
end Thu Nov 26 11:49:47 2020
每个子过程是同时执行的
再一个异步例子
import asyncio import time import numpy as np def tt(): return time.asctime( time.localtime(time.time()) ) async def cal(x,y): result = np.matmul(x,y) async def slow_operation(n): print('slow operation_{}_complete'.format(n)) a = np.random.random((5000,10000)) b = np.random.random((10000,5000)) await asyncio.wait([cal(a,b)]) print('每个子过程',tt()) async def main(): print('start',tt()) await asyncio.wait([slow_operation(1), slow_operation(2), slow_operation(3)]) print('end',tt()) loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()
输出结果:
start Thu Nov 26 19:36:07 2020
slow operation_3_complete
slow operation_1_complete
slow operation_2_complete
每个子过程 Thu Nov 26 19:36:20 2020
每个子过程 Thu Nov 26 19:36:20 2020
每个子过程 Thu Nov 26 19:36:20 2020
end Thu Nov 26 19:36:20 2020
这个矩阵计算很费时间,我们用await asyncio.wait这个挂起这个动作后,就不影响自身的运行
浙公网安备 33010602011771号