web 部署專題(二):gunicore 並發部署(用gunicorn+gevent啟動Flask項目)


轉自:https://blog.csdn.net/dutsoft/article/details/51452598

Flask,webpy,Django都帶着 WSGI server,當然性能都不好,自帶的web server 更多的是測試用途。線上發布時,則使用高性能的 wsgi server或者是聯合nginx做uwsgi 。 
greenlet是一個輕量級的協程庫。gevent是基於greenlet的網絡庫。 
guincorn是支持wsgi協議的http server,gevent只是它支持的模式之一 ,是為了解決django、flask這些web框架自帶wsgi server性能低下的問題。

它的特點是與各個web框架結合緊密,部署特別方便

gunicorn使用

使用多進程

在多核服務器上,為了支持更多的並發訪問並充分利用資源,可以使用更多的 gunicorn 進程。 
gunicorn -w 8 code:application 
這樣就可以啟動8個進程同時處理HTTP請求,提高系統的使用效率及性能。

配合gevent

另外, gunicorn 默認使用同步阻塞的網絡模型(-k sync),對於大並發的訪問可能表現不夠好, 它還支持其它更好的模式,比如:gevent或meinheld。

# gevent
gunicorn -k gevent code:application

指定配置文件

以上設置還可以通過 -c 參數傳入一個配置文件實現。 
gunicorn - gun.conf code:application

# 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

gevent是一個基於libev的並發庫。它為各種並發和網絡相關的任務提供了整潔的API。gunicorn對於“協程”也就是Gevent的支持非常好。 

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/87041

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應用

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()

用gunicorn啟動Flask應用

配置文件gun.py

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來啟動

gunicorn -c gun.py hello:app

單純的flask 自帶的web服務器做下測試,會看到壓力大的時候出現socket的問題,因為他是單進程單線程的。使用gunicorn來啟動,響應速度和能力提升顯著。 
配置中workers指定啟動的進程數。cpu的損耗是平均到各個進程。workers的值一定不要過大,畢竟多進程對於系統的調度消耗比較大。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM