溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

django處理高并發(fā)的方法

發(fā)布時(shí)間:2020-09-02 10:10:50 來(lái)源:億速云 閱讀:308 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了django處理高并發(fā)的方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

django 的并發(fā)能力真的是令人擔(dān)憂,這里就使用 nginx + uwsgi 提供高并發(fā)

nginx 的并發(fā)能力超高,單臺(tái)并發(fā)能力過(guò)萬(wàn)(這個(gè)也不是絕對(duì)),在純靜態(tài)的 web 服務(wù)中更是突出其優(yōu)越的地方,由于其底層使用 epoll 異步IO模型進(jìn)行處理,使其深受歡迎

做過(guò)運(yùn)維的應(yīng)該都知道,php 需要使用 nginx + fastcgi 提供高并發(fā),java 需要使用 nginx + tomcat 提供 web 服務(wù)

如何再次增加并發(fā)量

采用nginx做負(fù)載

去掉自增主鍵

原因很簡(jiǎn)單,因?yàn)樽栽鲋麈I的存在寫庫(kù)存在搶鎖, 可以利用全局id生成器提前生成id直接寫入數(shù)據(jù)庫(kù)

換成異步任務(wù)去寫庫(kù)

如果數(shù)據(jù)只是存在mysql中做備份,建議使用異步的方式寫入庫(kù),先把數(shù)據(jù)寫到緩存下發(fā)給用戶,之后在利用后臺(tái)異步任務(wù)一點(diǎn)點(diǎn)的寫入,例如聊天系統(tǒng)可以這樣干

換成更高效的框架或者語(yǔ)言

可以試試tornado, 如果tornado依然無(wú)法滿足,可以嘗試使用golango,畢竟golang是以高并發(fā)著稱, 而且是編譯語(yǔ)言,而且基于它的web框架也很容易上手,性能很可觀,例如Iris。

django

毫無(wú)疑問(wèn),用原生django的server做處理的表現(xiàn)是最爛的,在10000次請(qǐng)求的情況下brokenpipe的幾率極高,只有1400次請(qǐng)求被處理,成功率只有14%。

django + nginx

這次搭上了nginx做反向代理,也使的脆弱的django服務(wù)器的情況有所緩解,但成功率仍然不高(10000次請(qǐng)求中有3684個(gè)請(qǐng)求被處理)。

uwsgi + nginx

uwsgi是性能極高的一個(gè)由C編寫的服務(wù)器,它使用uwsgi協(xié)議,這次讓它配合nginx處理django的request,參數(shù)為4進(jìn)程+2線程,性能立即直線上升,處理請(qǐng)求的成功率也基本在90%左右,不過(guò)我在測(cè)試時(shí)遇到了一個(gè)坑,就是uwsgi在處理請(qǐng)求的時(shí)候發(fā)送了隊(duì)列溢出的問(wèn)題,因?yàn)楫?dāng)前測(cè)試設(shè)置的并發(fā)數(shù)為每秒1000次并發(fā),而uwsgi的處理隊(duì)列容量默認(rèn)為100,導(dǎo)致處理請(qǐng)求的時(shí)間加長(zhǎng),而這個(gè)問(wèn)題則可以通過(guò)修改somaxcon的大小解決,總的來(lái)說(shuō),使用uwsgi+nginx是一個(gè)理想的選擇。

gunicorn + nginx

gunicorn跟uwsgi類似,也是一個(gè)高性能的http服務(wù)器,它由ruby的unicorn項(xiàng)目移植,是由python編寫的,它的配置簡(jiǎn)單,而且可以靈活地搭配其他網(wǎng)絡(luò)庫(kù),部署十分方便,在測(cè)試數(shù)據(jù)中可以看到,用這種配置運(yùn)行django能在短時(shí)間內(nèi)就能處理大量的并發(fā)請(qǐng)求,成功率在90%左右。

gunicorn + nginx + gevent

前面說(shuō)的幾種環(huán)境,看似不錯(cuò),但我們需要追求完美!由于gunicorn是同步(sync)單線程模型的,有的時(shí)候它不免會(huì)發(fā)生一些阻塞問(wèn)題,這時(shí)候我們?yōu)間unicorn加上-k gevent參數(shù)來(lái)用gevent做處理接口,這就比較靠譜地處理了阻塞問(wèn)題,從數(shù)據(jù)中可以看到,gunicorn + nginx + gevent的模式不僅擁有100%的處理成功率,而且時(shí)間也在很短之內(nèi)完成,是5組測(cè)試數(shù)據(jù)當(dāng)中的性能最好的。

多套方案來(lái)提高 python web 框架的并發(fā)處理能力

Python 常見(jiàn)部署方法有 :

fcgi :用 spawn-fcgi 或者框架自帶的工具對(duì)各個(gè) project 分別生成監(jiān)聽(tīng)進(jìn)程,然后和 http 服務(wù)互動(dòng)

wsgi :利用 http 服務(wù)的 mod_wsgi 模塊來(lái)跑各個(gè) project(Web 應(yīng)用程序或框架簡(jiǎn)單而通用的 Web 服務(wù)器 之間的接口)。

uWSGI 是一款像 php-cgi 一樣監(jiān)聽(tīng)同一端口,進(jìn)行統(tǒng)一管理和負(fù)載平衡的工具,uWSGI,既不用 wsgi 協(xié)議也不用 fcgi 協(xié)議,而是自創(chuàng)了一個(gè) uwsgi 的協(xié)議,據(jù)說(shuō)該協(xié)議大約是 fcgi 協(xié)議的 10 倍那么快。

其實(shí) WSGI 是分成 server 和 framework (即 application) 兩部分 (當(dāng)然還有 middleware)。

嚴(yán)格說(shuō) WSGI 只是一個(gè)協(xié)議, 規(guī)范 server 和 framework 之間連接的接口。

WSGI server 把服務(wù)器功能以 WSGI 接口暴露出來(lái)。比如 mod_wsgi 是一種 server, 把 apache 的功能以 WSGI 接口的形式提供出來(lái)。

WSGI framework 就是我們經(jīng)常提到的 Django 這種框架。不過(guò)需要注意的是, 很少有單純的 WSGI framework , 基于 WSGI 的框架往往都自帶 WSGI server。比如 Django、CherryPy 都自帶 WSGI server 主要是測(cè)試用途, 發(fā)布時(shí)則使用生產(chǎn)環(huán)境的 WSGI server。而有些 WSGI 下的框架比如 pylons、bfg 等, 自己不實(shí)現(xiàn) WSGI server。使用 paste 作為 WSGI server。

Paste 是流行的 WSGI server, 帶有很多中間件。還有 flup 也是一個(gè)提供中間件的庫(kù)。

搞清除 WSGI server 和 application, 中間件自然就清楚了。除了 session、cache 之類的應(yīng)用, 前段時(shí)間看到一個(gè) bfg 下的中間件專門用于給網(wǎng)站換膚的 (skin) 。中間件可以想到的用法還很多。

這里再補(bǔ)充一下, 像 django 這樣的框架如何以 fastcgi 的方式跑在 apache 上的。這要用到 flup.fcgi 或者 fastcgi.py (eurasia 中也設(shè)計(jì)了一個(gè) fastcgi.py 的實(shí)現(xiàn)) 這些工具, 它們就是把 fastcgi 協(xié)議轉(zhuǎn)換成 WSGI 接口 (把 fastcgi 變成一個(gè) WSGI server) 供框架接入。整個(gè)架構(gòu)是這樣的: django -> fcgi2wsgiserver -> mod_fcgi -> apache 。

雖然我不是 WSGI 的粉絲, 但是不可否認(rèn) WSGI 對(duì) python web 的意義重大。有意自己設(shè)計(jì) web 框架, 又不想做 socket 層和 http 報(bào)文解析的同學(xué), 可以從 WSGI 開(kāi)始設(shè)計(jì)自己的框架。在 python 圈子里有個(gè)共識(shí), 自己隨手搞個(gè) web 框架跟喝口水一樣自然, 非常方便。或許每個(gè) python 玩家都會(huì)經(jīng)歷一個(gè)倒騰框架的。

uWSGI 的主要特點(diǎn)如下:

超快的性能。

低內(nèi)存占用(實(shí)測(cè)為 apache2 的 mod_wsgi 的一半左右)。

多app管理。

詳盡的日志功能(可以用來(lái)分析 app 性能和瓶頸)。

高度可定制(內(nèi)存大小限制,服務(wù)一定次數(shù)后重啟等)。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享django處理高并發(fā)的方法內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI