Python Web編程之WSGI協(xié)議簡介
本文實例講述了Python Web編程之WSGI協(xié)議。分享給大家供大家參考,具體如下:
WSGI簡介
Web框架和Wen服務(wù)器之間需要進(jìn)行通信,如果在設(shè)計時它們之間無法相互匹配,那么對框架的選擇就會限制對Web服務(wù)器的選擇,這顯然是不合理的。這時候需要設(shè)計一套雙方都遵守的接口。WSGI是Python Web Server Gateway Interface的簡稱。WSGI標(biāo)準(zhǔn)在PEP 333中定義并被許多框架實現(xiàn),它規(guī)定了一種在Web服務(wù)器之間具有可移植性。在后來的PEP 3333中添加了Python 3的支持和更多相關(guān)的說明。有了通用的WSGI協(xié)議,Web開發(fā)者就能夠任意選擇適合自己的組合,而Web服務(wù)器和Web框架的開發(fā)者們也能夠把精力集中到各自的領(lǐng)域。
常見的WSGI容器
WSGI是一個同步接口,所以Tornado的WSGI容器是無法實現(xiàn)異步的。主流的選擇是Gunicorn和uWSGI。
Gunicorn
Gunicorn易于配置,兼容性好,CPU消耗很少,在豆瓣使用廣泛。它支持多種Worker模式,推薦的模式有如如下幾種:
- 同步Worker:默認(rèn)模式,也就是一次只處理一個請求
- 異步Worker:通過Eventlet、Gevent實現(xiàn)的異步模式
- 異步IO Worker:目前支持gthread和gaiohttp兩種類型
安裝Gunicorn:
pip install gunicorn
Gunicorn的啟動非常簡單,語法如下:
gunicorn [OPTIONS] MODULE_NAME:VARIABLE_NAME
舉個栗子,manager.py:
from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return "Hello World" if __name__ == "__main__": app.run()
啟動應(yīng)用:
gunicorn manager:app -b 0.0.0.0:9000
亦或者指定Worker數(shù)量啟動:
gunicorn --workers=3 manager:app -b 0.0.0.0:9000
app為Flask實例的名稱,Worker的數(shù)量推薦值是CPU的個數(shù)*2+1,CPU個數(shù)使用如下的方式獲取:
python -c 'import multiprocessing; print multiprocessing.cpu_count()'
uWSGI
uWSGI是使用C編寫的,顯示了自有的uwsgi協(xié)議的Web服務(wù)器。它自帶豐富的組件,其中核心組件包含進(jìn)程管理、監(jiān)控、IPC等功能,實現(xiàn)應(yīng)用服務(wù)器接口的請求插件支持多種語言和平臺,比如WSGI、Rack、Lua WSAPI,網(wǎng)管組件實現(xiàn)了負(fù)載均衡、代理和理由功能。
安裝uWSGI
pip install uwsgi
使用uWSGI啟動應(yīng)用:
上面的命令表示啟動了4個進(jìn)程,每個進(jìn)程使用2個線程,而且開啟了5000的Web接口,返回監(jiān)控uWSGI的信息,一級不同進(jìn)程和線程的詳細(xì)使用情況。使用uWSGI有兩點(diǎn)十分重要:
–http-socket
和–http
其實是完全不同的兩個選項。如果想直接裸跑uWSGI,應(yīng)該使用–http
,它產(chǎn)生一個額外的進(jìn)程將請求轉(zhuǎn)發(fā)給Workers,如果希望它被反向代理(比如和Nginx一起使用),應(yīng)該使用–http-socket
。
合理的進(jìn)程數(shù)和線程數(shù)不能簡單的通過CPU * 2來計算得出,需要不斷的嘗試而找到最佳值。
uWSGI命令常用參數(shù)如下:
參數(shù)名 | 含義 |
---|---|
–http | 協(xié)議類型和端口號 |
–processes | 開啟的進(jìn)程數(shù)量 |
–callable | uWSGI加載的模塊哪個變量將被調(diào)用 |
–workers | 開啟的進(jìn)行數(shù)量,等同于processes |
–chdir | 指定運(yùn)行目錄 |
–wsgi-file | 載入wsgi-file(加載wsgi.py文件) |
–stats | 在指定的地址上開啟狀態(tài)服務(wù) |
–threads | 開啟的線程數(shù)量 |
–master | 允許主進(jìn)程存在 |
–daemonize | 使進(jìn)程在后臺運(yùn)行,并將日志輸出到指定的日志文件或者UDP服務(wù)器 |
–pidfile | 指定PID文件的位置,記錄主進(jìn)程的PID號 |
–vacuum | 當(dāng)服務(wù)器退出時自動清理環(huán)境,刪除Unix Socket文件和PID文件 |
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python Socket編程技巧總結(jié)》、《Python URL操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
- python wsgiref源碼解析
- 淺析Python 中的 WSGI 接口和 WSGI 服務(wù)的運(yùn)行
- Docker構(gòu)建python Flask+ nginx+uwsgi容器
- python 解決flask uwsgi 獲取不到全局變量的問題
- VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法詳解
- Python開發(fā)之Nginx+uWSGI+virtualenv多項目部署教程
- CentOS7部署Flask(Apache、mod_wsgi、Python36、venv)
- 詳解如何在Apache中運(yùn)行Python WSGI應(yīng)用
- python Web開發(fā)你要理解的WSGI & uwsgi詳解
- Python WSGI 規(guī)范簡介
相關(guān)文章
使用Docker制作Python環(huán)境連接Oracle鏡像
這篇文章主要為大家介紹了使用Docker制作Python環(huán)境連接Oracle鏡像示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06利用Python和OpenCV庫將URL轉(zhuǎn)換為OpenCV格式的方法
這篇文章主要介紹了利用Python和OpenCV庫將URL轉(zhuǎn)換為OpenCV格式的方法,同時用到了NumPy和urllib,需要的朋友可以參考下2015-03-03python多線程性能測試之快速mock數(shù)據(jù)
這篇文章主要為大家介紹了python多線程性能測試之快速mock數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06PyTorch中torch.tensor與torch.Tensor的區(qū)別詳解
這篇文章主要介紹了PyTorch中torch.tensor與torch.Tensor的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05conda換源安裝torch+vscode分布式訓(xùn)練調(diào)試的實現(xiàn)
本文主要介紹了conda換源安裝torch+vscode分布式訓(xùn)練調(diào)試的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06Python OpenCV學(xué)習(xí)之特征點(diǎn)檢測與匹配詳解
提取圖像的特征點(diǎn)是圖像領(lǐng)域中的關(guān)鍵任務(wù),不管在傳統(tǒng)還是在深度學(xué)習(xí)的領(lǐng)域中,特征代表著圖像的信息,對于分類、檢測任務(wù)都是至關(guān)重要的。這篇文章主要為大家詳細(xì)介紹了OpenCV特征點(diǎn)檢測與匹配,需要的可以參考一下2022-01-01