python web框架多程序部署下資料庫連線問題

2021-10-22 10:18:36 字數 1003 閱讀 4905

python常用的web框架,諸如flask,django,在生產部署時,都會選擇多程序的部署方式,選用的中介軟體多為uwsgi或者gunicorn。

如果專案裡使用了資料庫,那麼就要考慮資料庫連線在多程序下的一些問題,本文以mysql資料庫為例。

python連線mysql的客戶端驅動庫有很多種,例如pymysql,它們都提供了資料庫連線池,連線池是多執行緒安全的,多程序下並不安全。

多執行緒的安全,是通過執行緒鎖解決的,這非常容易做到,而多程序加鎖則並不容易。

我所謂的多程序,是由主程序fork出來的子程序,如果主程序裡建立了資料庫連線池,隨後fork出子程序,子程序在獲取資料庫連線時,兩個子程序就有可能獲得同乙個資料庫連線,這樣就會引發問題。

乙個資料庫連線,本質上就是乙個socket連線,建立socket連線後,得到乙個開啟的socket物件,當兩個程序都用這同乙個socket物件傳送和接收資料時,就會引發異常。

對於這種部署方式,我一直都擔心出現子程序共用同乙個資料庫連線的問題,直到最近,猛然間找到了問題的本質。

目前所用的資料庫連線驅動庫,都有乙個惰性連線的特性。如果你設定連線池的大小是10,那麼當程式啟動後,連線池並沒有真的被建立,只有當程式進行一次資料庫操作時,才會真的去建立連線。當連線數量不夠時,才會去新建連線,如果連線池裡有空閒的連線,會直接拿來使用。

只要父程序沒有對資料庫進行操作,父程序便不會建立資料庫連線池。

當請求真實到達時,已經完成了fork動作,此時的子程序,並沒有從父程序那裡繼承資料庫連線池,因為父程序自己也沒有建立連線池。

請求打到某個字程序,這個子程序在進行資料庫操作時建立只屬於自己的資料庫連線池,不會受到其他子程序的干擾。

多程序部署模式下,如果你不開啟多執行緒,那麼乙個子程序便只有乙個執行緒,此時,你設定連線池的大小為1即可。設定的更大,也不會建立出更多的連線,因為對於單個子程序來說,有乙個資料庫連線就已經足夠了。

為了提高響應能力,你開啟執行緒,uwsgi和gunicorn都允許你這樣做。那麼你要根據執行緒的數量來設定連線池的大小,與其相等即可,多了也同樣不起作用。

多程序框架

今天早晨上班的路上突然想到chromium的多程序實現,我們分析可以知道,chrome介面上面你看到的所有所有視窗都是在同乙個主程序裡面建立的,但是tab對應的網頁的渲染卻不是在這個程序裡面做的。我突然想到了另外一種實現,我們每天對著的windows自己的視窗 比如資源管理器,工作列都是在explo...

python web開發框架

django python web應用開發框架 django 應該是最出名的python框架,gae甚至erlang都有框架受它影響。django是走大而全的方向,它最出名的是其全自動化的管理後台 只需要使用起orm,做簡單的物件定義,它就能自動生成資料庫結構 以及全功能的管理後台。diesel 基...

python web框架 推薦

flask 很輕,花很少的成本就能夠開發乙個簡單的 非常適合初學者學習。學會以後,可以考慮學習外掛程式的使用,用 sqlalchemy flask sqlalchemy 來對你的資料庫進行控制。django全能型框架 但是不建議初學者學習,因為要學習的東西太多了,一下子難以吸收會失去興趣。當然,dj...