gevent是Python的一个用于网络IO的函数库,其中应用到了 coroutine(协同程序) 的思想。首先来了解下目前网络框架的几种基本的网络I/O模型: python
阻塞式单线程:这是最基本的I/O模型,只有在处理完一个请求以后才会处理下一个请求。它的缺点是效能差,若是有请求阻塞住,会让服务没法继续接受请求。可是这种模型编写代码相对简单,在应对访问量不大的状况时是很是适合的。 react
阻塞式多线程:针对于单线程接受请求量有限的缺点,一个很天然的想法就是给每个请求开一个线程去处理。这样作的好处是可以接受更多的请求,缺点是在线程产生到必定数量以后,进程之间须要大量进行切换上下文的操做,会占用CPU大量的时间,不过这样处理的话编写代码的难道稍高于单进程的状况。 shell
非阻塞式事件驱动:为了解决多线程的问题,有一种作法是利用一个循环来检查是否有网络IO的事件发生,以便决定如何来进行处理(reactor设计模式)。这样的作的好处是进一步下降了CPU的资源消耗。缺点是这样作会让程序难以编写,由于请求接受后的处理过程由reactor来决定,使得程序的执行流程难以把握。当接受到一个请求后若是涉及到阻塞的操做,这个请求的处理就会停下来去接受另外一个请求,程序执行的流程不会像线性程序那样直观。twisted框架就是应用这种IO模型的典型例子。 设计模式
非阻塞式Coroutine:这个模式是为了解决事件驱动模型执行流程不直观的问题,它在本质上也是事件驱动的,加入了Coroutine的概念,我要学习的gevent就是应用这种IO模型的函数库。 网络
接下来讲说Coroutine(协程)这个概念,coroutine能够理解为一个轻量级的线程,为了解决了多线程上下文切换的损耗,提供了一个软件的协程切换。而且相对于事件驱动,可以将程序的执行过程由编写程序的人更好的控制。下面的图展示了协程的执行过程: 多线程
在了解了关于gevent的基本概念以后,接下来了就开始安装gevent。 框架
apt-get install libevent-dev apt-get install python-all-dev pip install gevent
如今基本的概念了解后,接下来就能够开始了解相关的代码了 函数