对python async与await的理解

        async/await关键字是出如今python3.4之后。网上已经有不少文章对async/await这两个关键字都有讲解,包括如何由python2的yield from发展到async/await这两个关键字,以及一些代码实现都有。可是对于像我这样初次接触的人来讲,光看代码分析也不必定能理解,我也是在度娘上搜索不少相关的网站,当中也有官网,都没有发现能让我一眼看懂在什么地方能够用await,什么状况用await的文章。通过本身的从新思考,总算对async、await有一些初步的了解,因此想把本身的理解记录下来,但愿对一些学习协程或者异步的初学者也有必定的帮助。python

对于网上能搜到的一些代码实现、例子,这里就不重复了。segmentfault

1、首先要知道什么是协程、异步。多线程

举个例子:假设有1个洗衣房,里面有10台洗衣机,有一个洗衣工在负责这10台洗衣机。那么洗衣房就至关于1个进程,洗衣工就至关1个线程。若是有10个洗衣工,就至关于10个线程,1个进程是能够开多线程的。这就是多线程!app

那么协程呢?先不急。你们都知道,洗衣机洗衣服是须要等待时间的,若是10个洗衣工,1人负责1台洗衣机,这样效率确定会提升,可是不以为浪费资源吗?明明1 我的能作的事,却要10我的来作。只是把衣服放进去,打开开关,就没事作了,等衣服洗好再拿出来就能够了。就算不少人来洗衣服,1我的也足以应付了,开好第一台洗衣机,在等待的时候去开第二台洗衣机,再开第三台,……直到有衣服洗好了,就回来把衣服取出来,接着再取另外一台的(哪台洗好先就取哪台,因此协程是无序的)。这就是计算机的协程!洗衣机就是执行的方法。异步

当你程序中方法须要等待时间的话,就能够用协程,效率高,消耗资源少。async

好了!如今来总结一下:函数

洗衣房 ==> 进程oop

洗衣工 ==> 线程学习

洗衣机 ==> 方法(函数)网站

2、async\await 的使用

正常的函数在执行时是不会中断的,因此你要写一个可以中断的函数,就须要添加async关键。

async 用来声明一个函数为异步函数,异步函数的特色是能在函数执行过程当中挂起,去执行其余异步函数,等到挂起条件(假设挂起条件是sleep(5))消失后,也就是5秒到了再回来执行。

await 用来用来声明程序挂起,好比异步程序执行到某一步时须要等待的时间很长,就将此挂起,去执行其余的异步程序。await 后面只能跟异步程序或有__await__属性的对象,由于异步程序与通常程序不一样。假设有两个异步函数async a,async b,a中的某一步有await,当程序碰到关键字await b()后,异步程序挂起后去执行另外一个异步b程序,就是从函数内部跳出去执行其余函数,当挂起条件消失后,无论b是否执行完,要立刻从b程序中跳出来,回到原程序执行原来的操做。若是await后面跟的b函数不是异步函数,那么操做就只能等b执行完再返回,没法在b执行的过程当中返回。若是要在b执行完才返回,也就不须要用await关键字了,直接调用b函数就行。因此这就须要await后面跟的是异步函数了。在一个异步函数中,能够不止一次挂起,也就是能够用多个await。

3、实例:

 1 async def test2(i):
 2     r = await other_test(i)
 3     print(i,r)
 4 
 5 async def other_test(i):
 6     r = requests.get(i)
 7     print(i)
 8     await asyncio.sleep(4)
 9     print(time.time()-start)
10     return r
11 
12 url = ["https://segmentfault.com/p/1210000013564725",
13        "https://www.jianshu.com/p/83badc8028bd",
14        "https://www.baidu.com/"]
15 
16 loop = asyncio.get_event_loop()
17 task = [asyncio.ensure_future(test2(i)) for i in url]
18 start = time.time()
19 20 loop.run_until_complete(asyncio.wait(task))
21 endtime = time.time()-start
22 print(endtime)
23 loop.close()

输出结果:

 1 https://segmentfault.com/p/1210000013564725
 2 https://www.jianshu.com/p/83badc8028bd
 3 https://www.baidu.com/
 4 4.425147771835327
 5 https://segmentfault.com/p/1210000013564725 <Response [200]>
 6 4.5975635051727295
 7 https://www.jianshu.com/p/83badc8028bd <Response [403]>
 8 4.722797632217407
 9 https://www.baidu.com/ <Response [200]>
10 4.722797632217407

对于下面这几行代码:

loop = asyncio.get_event_loop() task = [asyncio.ensure_future(test2(i)) for i in url] loop.run_until_complete(asyncio.wait(task)) loop.close()
能够在网上找到具体讲解,在这可用下图来粗略形容一下

当全部的异步程序运行完就会返回最后结果。
对于什么是task和future,asyncio.wait()与asyncio.gather()、asyncio.ensure_future()这些你们能够网上找到解释。

说到这里,相信你也大概清楚在何时用async、何时await了吧! 若是有说得不对的地方,请多多指正!!

 

相关文章
相关标签/搜索