Gevent 是一个非常好用的异步工具,能够自动将阻塞的代码转换成非阻塞的代码。
这个功能是通过MonkeyPatch
来实现的。
MonkeyPatch
通过 Hook 底层的代码库,来实现上层代码无变更,透明的底层实现更改。
在底层,Gevent 使用的库是libev
或者libuv
。这是实现了与nodejs
同级别的高性能。
IO模型
如果读者尚未理解非阻塞,那么建议看一下IO的四种模型。分别是:
- 同步阻塞
- 同步非阻塞
- IO多路复用
- 异步IO
在不同场景下选择不同的IO模型,可以有效的利用系统资源,更快的响应用户的请求。
IO slow problem
之所以会有IO问题存在,原因有两个:
- IO 设备的速度慢;
- 用户态和内核态的转变;
IO 设备速度慢,就要等待 IO 读取。
用户态进程必须通过系统调用,向内核发出指令,才能调用系统资源。 此外,用户态进程进行读写操作的时候,必然涉及到缓冲区。 读写操作不会直接对设备进行。因此,在进行读操作的时候, 系统从设备将数据读取,拷贝到内核缓冲区。用户进程如果想要使用 读取的数据,须从内核缓冲区复制到进程缓冲区。
因此,速度慢了,等待就耗时。反应到用户层面,就会出现,用户新开浏览器,但是系统仍然没有反应的情况。