gunicorn是一个python Wsgi http server,只支持在Unix系统上运行,来源于Ruby的unicorn项目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被称为arbiter),能够与各种wsgi web框架协作。gunicorn的文档是比较完善的,这里也有部分中文翻译,不过还是建议直接读英文文档。笔者并没有在项目中真正使用过gunicorn,阅读其源码只要是为了了解其master worker模型,如有纰漏,还请多多指教。
 
  gunicorn的安装非常简单,pip install guncorn 即可。后续如果用到异步的worker模型,还需要安装对应的模块(如gevent)
  在装好gunicorn之后, 我们来看看gunicorn的hello world。代码来自官网,将下面的代码放到gunicorn_app.py中:
  

     def app(environ, start_response):
data = b"Hello, World!\n"
start_response("200 OK", [
("Content-Type", "text/plain"),
("Content-Length", str(len(data)))
]) return iter([data])

  可以看到app是非常标准的wsgi应用,然后我们启动gunicorn:gunicorn -w 2 gunicorn_app:app。 输出如下:

  

  上图展示了两个很重要的信息:
  第一:启动了两个worker,这是通过"-w 2"指定(默认为1)
  第二:worker的工作模型是sync(默认),后面会详细介绍worker模型
 
  然后在另外一个terminal运行:ps -ef | grep python 
  
  可以看出 worker进程(pid:19469, 19470)是master进程(pid:19464)的子进程。
 
  新起一个terminal,用curl测试:  curl 127.0.0.1:8000
  在该terminal输出“Hello, World!”
 
  前面提到,官方gunicorn只能在Unix上运行(貌似也有非官网的补丁,使其能在windows上运行,未求证),主要是因为源码中使用了fcntl,os.fork等只在unix上存在的模块和接口。pre-fork就是指gunicorn启动的时候,在主进程中会预先fork出指定数量(-w)的worker进程。这里先简介Master Worker的工作流程,后文再对代码做详细介绍。
 
  启动gunicorn,首先初始化gunicorn.app.base.Application(或者基类,比如上面从命令行启动时,是wsgiApplication),初始化中最重要的是读取配置,支持文件或者命令行。然后调用Application.run(),该方法代码如下:
  

    def run(self):
try:
Arbiter(self).run()
except RuntimeError as e:
print("\nError: %s\n" % e, file=sys.stderr)
sys.stderr.flush()
sys.exit(1)
  调用Arbiter(self).run()之后,主进程(master)的所有逻辑都运行在Arbiter类里面。
 
  Arbiter首先读取配置项, 如worker数量,worker工作模式,监听的地址等;然后初始化信号处理函数,然后建立socket,不过并不listen;接下来fork出所有的worker进程;最后进入循环:处理信号队列中的信号,杀掉并重启失去响应的子进程,如果没事儿干,就“sleep”一会儿。
 
  worker进程就更加简单一下,首先是读取配置,初始化信号处理函数,然后进入循环:处理监听端口上的请求(也就是会调用到wsgi app的地方),然后向master报告自己还活着。另外,worker中是在信号发生的时候直接处理信号,而不是像master一样放入信号队列。
 
  可以稍微改动一下app代码,以便在客户端请求的时候,服务器端能打印调用栈,下面是在我的机器上的输出,后面将会对Arbiter和worker进行介绍。
  • 0: FUNC:app(...)                  /home/xxx/gunicorn_app.py::16
  • 1: FUNC:handle_request(...)       /usr/local/lib/python2.7/dist-packages/gunicorn/workers/sync.py::176
  • 2: FUNC:handle(...)               /usr/local/lib/python2.7/dist-packages/gunicorn/workers/sync.py::135
  • 3: FUNC:accept(...)               /usr/local/lib/python2.7/dist-packages/gunicorn/workers/sync.py::30
  • 4: FUNC:run_for_one(...)          /usr/local/lib/python2.7/dist-packages/gunicorn/workers/sync.py::68
  • 5: FUNC:run(...)                  /usr/local/lib/python2.7/dist-packages/gunicorn/workers/sync.py::124
  • 6: FUNC:init_process(...)         /usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py::132
  • 7: FUNC:spawn_worker(...)         /usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py::557
  • 8: FUNC:spawn_workers(...)        /usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py::590
  • 9: FUNC:manage_workers(...)       /usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py::524
  • 10: FUNC:run(...)                  /usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py::189
  • 11: FUNC:run(...)                  /usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py::72
  • 12: FUNC:run(...)                  /usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py::192
  • 13: FUNC:run(...)                  /usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py::74
  • 14: FUNC:<module>(...)             /usr/local/bin/gunicorn::11
 
 
 
 

gunicorn 简介的更多相关文章

  1. Python3 Flask+nginx+Gunicorn部署(上)

    前言:一般在本地运行flask项目通常是直接python3 文件名.py,然后打开:http://127.0.0.1:5000 查看代码结果 这次主要是记录flask在python3 环境结合ngin ...

  2. gunicorn 介绍与性能分析

    阅读此文前建议先阅读 我的博客 gunicorn 是一个 python wsgi http server,只支持在 unix 系统上运行 安装 gunicorn 其实是 python 的一个包,安装方 ...

  3. Python之路【第一篇】:Python简介和入门

    python简介: 一.什么是python Python(英国发音:/ pa θ n/ 美国发音:/ pa θɑ n/),是一种面向对象.直译式的计算机程序语言. 每一门语言都有自己的哲学: pyth ...

  4. python Gunicorn

    1. 简介 Gunicorn(Green Unicorn)是给Unix用的WSGI HTTP 服务器,它与不同的web框架是非常兼容的.易安装.轻.速度快. 2. 示例代码1 def app(envi ...

  5. Python之路【第一篇】:Python简介和入门

    python简介: 一.什么是python Python(英国发音:/ pa θ n/ 美国发音:/ pa θɑ n/),是一种面向对象.直译式的计算机程序语言. 每一门语言都有自己的哲学: pyth ...

  6. 【原创】大数据基础之Airflow(1)简介、安装、使用

    airflow 1.10.0 官方:http://airflow.apache.org/ 一 简介 Airflow is a platform to programmatically author, ...

  7. Python3.x:第三方库简介

    Python3.x:第三方库简介 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex ...

  8. Python Web开发中的WSGI协议简介

    在Python Web开发中,我们一般使用Flask.Django等web框架来开发应用程序,生产环境中将应用部署到Apache.Nginx等web服务器时,还需要uWSGI或者Gunicorn.一个 ...

  9. Gunicorn、Supervisor

    简介 Gunicorn来源于Ruby的unicorn项目,是一个Python WSGI HTTP Server,通过pre-fork worker模型来管理和维护worker. 简而言之就是通过多进程 ...

随机推荐

  1. 想要学习Linux技术,先好好的读一本Linux书籍吧

    忘记你在使用windows时的使用习惯和使用思维.学习Linux,一定要适应Linux的命令行界面,因为命令行才是Linux的真正魅力所在,而X-window或着说桌面环境也只是运行在命令行模式下的一 ...

  2. 省市二级联动--使用app-jquery-cityselect.js插件

    只有省市二级联动,三级联动还没处理好,会尽快完善. 嵌入id: <div class="form-group"> <label>地址</label&g ...

  3. webservice中采用协议Http,它是指什么意思

    webservice 协议 Web Service使用的是 SOAP (Simple Object Access Protocol)协议soap协议只是用来封装消息用的.封装后的消息你可以通过各种已有 ...

  4. CodeForces 621B Wet Shark and Bishops

    记录一下每个对角线上有几个,然后就可以算了 #include<cstdio> #include<cstring> #include<cmath> #include& ...

  5. Jboss 集群配置

    环境配置:CentOS 7 x64 * 3 IP:  172.24.0.100        172.24.0.101        172.24.0.102 服务器配置: 172.24.0.100 ...

  6. STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解

    STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解 STM32的优先级NVIC_PriorityGroupConfig的理解及其使用 STM32中断优先级彻底讲解 S ...

  7. Maven deploy时报Fatal error compiling: tools.jar not found错误的问题处理

    摘自:http://blog.csdn.net/achilles12345/article/details/19046061 在Eclipse环境下,使用Maven进行deploy时发现报了该错误:F ...

  8. IOS 创建和设置pch

    1.添加pch文件 2.修改工程配置文件 Building Settings->All->Apple LLVM 6.0 -Language -> Prefix Header

  9. iOS 之 UIStackView

    UIStackView是iOS9新推出的布局控件,它的出现,可以说颠覆了以往的布局方式. 问题时,如果我使用UIStackView,它能用在iOS7.8系统中吗? 我要测试一下.测试程序我放到gith ...

  10. iOS 之 设置控件在视图中心位置

    _qrImgView.bounds = CGRectMake(0, 0, sizeImg, sizeImg); _qrImgView.center = CGPointMake(CGRectGetWid ...