异步

普通程序执行

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这个挂起这个动作后,就不影响自身的运行

 

posted on 2020-11-25 23:42  yukizzc  阅读(86)  评论(0)    收藏  举报