Gevent 是一个非常好用的异步工具,能够自动将阻塞的代码转换成非阻塞的代码。

这个功能是通过MonkeyPatch来实现的。

MonkeyPatch通过 Hook 底层的代码库,来实现上层代码无变更,透明的底层实现更改。

在底层,Gevent 使用的库是libev或者libuv。这是实现了与nodejs同级别的高性能。

IO模型

如果读者尚未理解非阻塞,那么建议看一下IO的四种模型。分别是:

  1. 同步阻塞
  2. 同步非阻塞
  3. IO多路复用
  4. 异步IO

在不同场景下选择不同的IO模型,可以有效的利用系统资源,更快的响应用户的请求。

IO slow problem

之所以会有IO问题存在,原因有两个:

  1. IO 设备的速度慢;
  2. 用户态和内核态的转变;

IO 设备速度慢,就要等待 IO 读取。

用户态进程必须通过系统调用,向内核发出指令,才能调用系统资源。 此外,用户态进程进行读写操作的时候,必然涉及到缓冲区。 读写操作不会直接对设备进行。因此,在进行读操作的时候, 系统从设备将数据读取,拷贝到内核缓冲区。用户进程如果想要使用 读取的数据,须从内核缓冲区复制到进程缓冲区。

因此,速度慢了,等待就耗时。反应到用户层面,就会出现,用户新开浏览器,但是系统仍然没有反应的情况。