1. 什么是Gevent
gevent是一个基于libev的python并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效.而且其中有个monkey类, 将现有基于Python线程直接转化为greenlet(类似于打patch).
greenlet 包是 Stackless 的副产品,其将微线程称为 “tasklet” 。tasklet运行在伪并发中,使用channel进行同步数据交换。
一个”greenlet”,是一个更加原始的微线程的概念,但是没有调度,或者叫做协程。这在你需要控制你的代码时很有用。你可以自己构造微线程的 调度器;也可以使用”greenlet”实现高级的控制流。例如可以重新创建构造器;不同于Python的构造器,我们的构造器可以嵌套的调用函数,而被嵌套的函数也可以 yield 一个值。(另外,你并不需要一个”yield”关键字,参考例子)。
2. 什么是 Coroutine
要理解Gevent,明白Gevent的执行机制,需要了解另外一个概念:Coroutine,中文叫做协程。第一次看见这个名词,确实很奇怪,进程、线程都了解了,突然冒出个协程,还真有点反应不过来。
按照 进程、线程和协程的理解 的说法:
进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度
上面的说法不是很好理解,后来发现这篇文章 浅谈coroutine与gevent, 里面对协程的解释