参考 关于gevent的几点思考

Greenlet

实现了一个比较易用 (相比yeild) 的协程切换的库。但是没有自己的调度过程,所以一般不会直接使用。

Eventlet

在 Greenlet的基础上实现了自己的 GreenThread,实际上就是 greenlet 类的扩展封装。

与 Greenlet 的不同是,Eventlet 实现了自己调度器称为Hub,Hub类似于Tornado的 IOLoop,是单实例的。在Hub中有一个event loop,根据不同的事件来切换到对应的 GreenThread。

同时 Eventlet 还实现了一系列的补丁来使Python标准库中的socket 等等 module 来支持GreenThread的切换。Eventlet的 Hub可以被定制来实现自己调度过程。

Gevent

Gevent 基于 libev 和 Greenlet。不同于 Eventlet 的用 python 实现的 hub 调度,Gevent 通过 Cython调用 libev来实现一个高效的 event loop调度循环。

同时类似于Eventlet,Gevent也有自己的monkey_patch,在打了补丁后,完全可以使用 python 线程的方式来无感知的使用协程,减少了开发成本。