前言
两者都是高性能的WSGI兼容的web服务器。既然是同种东西,必然有对比,网上有挺多benchmark,我也做过对应的benchmark,不过没有整理,这里推荐一下网上的一篇benchmark,能够看出meinheld的性能确实好得令人意外。那么为什么meinheld会比gevent性能高这么多呢?我们从底层实现来看看,他究竟做了一些什么。
meinheld和gevent
两者实现很相似。
meinheld:greenlet(协程) + picoev(高性能网络库)
gevent:greenlet(协程) + libevent(高性能网络库)
greenlet
python中的yield和第三方库greenlet,都是用来实现协程的利器。
greenlet 提供了在协程中直接切换控制权的方式,比生成器(yield)更加灵活、简洁。协程:又称微线程,纤程。
协程的这种“挂起”和“唤醒”机制实质上是将一个过程切分成了若干个子过程,给了我们一种以扁平的方式来使用事件回调模型。优点:共享进程的上下文,一个进程可以创建百万,千万的coroutine。
libevent
libevent是一个事件驱动的网络库,主要设计模式是Reactor(反应器)。
程序通过Libevent框架注册相应的事件和回调函数;当这些事件发生时,Libevent会调用这些回调函数处理相应的事件(I/O读写、定时和信号)。整个过程都是异步高效的。想看具体源码实现的请移步这里。这里我们只看主要处理部分event_base_loop。简要说明event_base_loop实现。
事件:首先loop中要处理的事件有3种,一种是计时事件(timeout触发),一种是普通I/O事件(select, poll,epoll),还有一种信号事件(signal),其中信号事件最终也是被转换成普通I/O事件被监听。流程:
1. 先通过Timer最小堆(以时间