轉自:https://blog.csdn.net/dutsoft/article/details/51452598html
Flask,webpy,Django都帶着 WSGI server,固然性能都很差,自帶的web server 更多的是測試用途。線上發佈時,則使用高性能的 wsgi server或者是聯合nginx作uwsgi 。
greenlet是一個輕量級的協程庫。gevent是基於greenlet的網絡庫。
guincorn是支持wsgi協議的http server,gevent只是它支持的模式之一 ,是爲了解決django、flask這些web框架自帶wsgi server性能低下的問題。python
它的特色是與各個web框架結合緊密,部署特別方便nginx
在多核服務器上,爲了支持更多的併發訪問並充分利用資源,能夠使用更多的 gunicorn 進程。 gunicorn -w 8 code:application
這樣就能夠啓動8個進程同時處理HTTP請求,提升系統的使用效率及性能。git
另外, gunicorn 默認使用同步阻塞的網絡模型(-k sync),對於大併發的訪問可能表現不夠好, 它還支持其它更好的模式,好比:gevent或meinheld。github
# gevent gunicorn -k gevent code:application
以上設置還能夠經過 -c 參數傳入一個配置文件實現。 gunicorn - gun.conf code:application
web
# cat gun.conf import os bind = '127.0.0.1:5000' workers = 4 backlog = 2048 worker_class = "sync" debug = True proc_name = 'gunicorn.proc' pidfile = '/tmp/gunicorn.pid' logfile = '/var/log/gunicorn/debug.log' loglevel = 'debug'
gevent是一個基於libev的併發庫。它爲各類併發和網絡相關的任務提供了整潔的API。gunicorn對於「協程」也就是Gevent的支持很是好。 django
Gevent 指南(英文):http://sdiehl.github.io/gevent-tutorial
Gevent 指南(中文):http://xlambda.com/gevent-tutorial
Gevent 指南(中文)下載地址:http://download.csdn.net/download/freeking101/9924351
初試Gevent – 高性能的Python併發框架:http://python.jobbole.com/87041flask
gevent 官網文檔:http://www.gevent.org/contents.html服務器
gevent For the Working Python Developer:http://sdiehl.github.io/gevent-tutorial/
Python 的協程庫 greenlet 和 gevent:https://blog.csdn.net/freeking101/article/details/97276736網絡
gevent.monkey介紹詳見:關於gevent monkey。
Flask是一個輕量級的Web框架,核心簡單而易於擴展。Flask介紹詳見:Flask文檔。
用Flask簡單寫了一個web例子,以下:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
import os import gevent.monkey gevent.monkey.patch_all() import multiprocessing debug = True loglevel = 'debug' bind = '0.0.0.0:8800' pidfile = 'log/gunicorn.pid' logfile = 'log/debug.log' #啓動的進程數 workers = multiprocessing.cpu_count() * 2 + 1 worker_class = 'gunicorn.workers.ggevent.GeventWorker' x_forwarded_for_header = 'X-FORWARDED-FOR'
gunicorn -c gun.py hello:app
單純的flask 自帶的web服務器作下測試,會看到壓力大的時候出現socket的問題,由於他是單進程單線程的。使用gunicorn來啓動,響應速度和能力提高顯著。 配置中workers指定啓動的進程數。cpu的損耗是平均到各個進程。workers的值必定不要過大,畢竟多進程對於系統的調度消耗比較大。