先接上篇说一下协程,四种方式
- 第一、二种较少用(了解)
- 第三种不太完美(必须知道)
- 第四种完美(最佳使用方式)
一、用 async await 语法实现协程函数,用 asyncio 模块实现运行协程(复杂)。
注解:asyncio模块不在详细讲解了,因为有更好的运行协程的方式
为什么复杂呢?
1、async 可跟其他关键字:async 函数、async for、async with 等,这样写的话,会非常麻烦也不清楚什么时候用。
2、await 可跟可等待对象,实际上 python 有很多可等待对象,比如【await 协程对象】、【await task】【await Futrue】我们一个一个去记忆去理解太多了。
async await 实现协程并运行(少用)
二、greenlet 把普通函数变为协程,阻塞自己判断手工进行切换(麻烦)
greenlet 是由 C 语言编写而成,让我们能用编写同步函数一样的方式编写函数或方法,但是各种IO等待时,需要我们自己来判断在哪里切换。
greenlet 实现协程并运行(少用)
三、gevent 把普通函数变为协程,遇到阻塞自动切换。(半完美)
现在最简便协程的使用方式是一个第三方的模块 gevent。 gevent 是由 grennlet 模块封装而来,实现的正常方式编写一般函数,遇到 部分阻塞 自动切换协程。IO类阻塞不加补丁不自动切换。
第三方模块我们得自己安装哦。
gevent 实现协程并运行(常用)
四、gevent 加入猴子补丁(完美)
一个 gevent 并不能把所有 IO函数 都自动切换了,比如 requests模块、socket 等等
下面看两个 HTTP 请求的例子进行对比
不加猴子补丁无法识别到 IO 阻塞
加入猴子补丁后,识别到 IO 阻塞
小伙伴,通过三篇文章,你知道 python 协程如何使用了吗?
如果你想了解 python 协程 如何从基本 生成器演变来的,
请点击【python协程之一:程序、进程、线程、协程、同步、异步概念】
【python 协程之二:协程使用范围、由来及演变过程】