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中:
1 def app(environ, start_response): 2 data = b"Hello, World!\n" 3 start_response("200 OK", [ 4 ("Content-Type", "text/plain"), 5 ("Content-Length", str(len(data))) 6 ]) 7 8 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!”