gunicorn初探.ppt

Gunicorn初探 Robby Zhou WSGI WSGI,全称?Web Server Gateway Interface,或者?Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。 WSGI 是作为 Web 服务器与 Web 应用程序或应用框架之间的一种低级别的接口,以提升可移植 Web 应用开发的共同点。WSGI 是基于现存的 CGI 标准而设计的。 很多框架都自带了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。当然性能都不好,自带的 web server 更多的是测试用途,发布时则使用生产环境的 WSGI server或者是联合 nginx 做 uwsgi 。 WSGI的作用 WSGI有两方:“服务器”或“网关”一方,以及“应用程序”或“应用框架”一方。服务方调用应用方,提供环境信息,以及一个回调函数(提供给应用程序用来将消息头传递给服务器方),并接收Web内容作为返回值。 所谓的 WSGI中间件同时实现了API的两方,因此可以在WSGI服务和WSGI应用之间起调解作用:从WSGI服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。 What’s Gunicorn Gunicorn()是一个 Python WSGI UNIX 的 HTTP 服务器, 是基于”pre-fork worker”模型,从 Ruby 的独角兽(Unicorn)项目移植。 Gunicorn 服务器与各种 Web 框架兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。 Gunicorn的特点 支持 Django,paster,wsgi程序 非常容易配置(相比较而言) 自动管理多个worker进程 可以采用不同的后台扩展接口(sync, gevent, tornado等) 原生并发访问性能不高,与 uWSGI, Bjoern等有一定的性能差距 HA的方案还不够完善 Gunicorn的设计 Gunicorn是基于”pre-fork worker”模型,这就意味着有一个中心主控master进程,由它来管理一组worker进程 Worker进程可以支持不同的IO方式(sync, gevent, eventlet, tornado, meinheld 等) Gunicorn的源码结构 从 Application.run() 开始,首先初始化配置,从文件读取,终端读取等等方式完成 configurate。然后启动 Arbiter,Arbiter 是实质上的 master 进程的核心,它首先从配置类中读取并设置,然后初始化信号处理函数,建立 socket。然后就是开始 spawn 工作进程,根据配置的工作进程数进行 spawn。然后就进入了轮询状态,收到信号,处理信号然后继续。这里唤醒进程的方式是建立一个 PIPE,通过信号处理函数往 pipe 里 write,然后 master 从 select.select() 中唤醒。 工作进程在 spawn 后,开始初始化,然后同样对信号进行处理,并且开始轮询,处理 HTTP 请求,调用 WSGI 的应用端,得到 resopnse 返回。然后继续。 Gevent Gevent是一种基于协程的Python网络库,它用到Greenlet提供的协 程,封装了libevent事件循环的高层同步API Gevent实现了WSGI,可以很方便的当作python的web server服务 器使用 Gevent的优点 Gevent最明显的特征就是它惊人的性能,尤其是当与传统线程解决方案对比的时候。在这一点上,当负载超过一定程度的时候,异步I/O的性能会大大的优于基于独立线程的同步I/O这几乎是常识了。 Gevent提供了看上去非常像传统的基于线程模型编程的接口,但是在隐藏在下面做的是异步I/O。更妙的是,它使得这一切透明。你可以继续使用这些普通的Python模块,比如用urllib2去处理HTTP请求,它会用Gevent替换那些普通的阻塞的Socket操作。 Gevent的性能 Gevent的不足之处 Gevent不能支持多进程。这意味着如果你要完全用到多核,你需要在多个端口上运行多个监听进程。可能需要运行类似于Nginx的东西去在这些服务监听进程中分发请求。 国内使用得比较少,相关资料比较匮乏。 Meinheld Meinheld 是一个高性能的兼容WSGI的we

文档评论(0)

1亿VIP精品文档

相关文档