我對mod_wsgi的多重處理特性和WSGI應用程序的一般設計有點困惑,它們將在具有多處理能力的WSGI服務器上執行。Python,WSGI,多處理和共享數據
考慮以下指令:
WSGIDaemonProcess example processes=5 threads=1
如果正確地明白的mod_wsgi將產生5的Python(例如CPython的)進程和任何這些方法中的可以接收來自用戶的請求。
文檔說:
如果共享數據必須是可見的所有應用程序實例,不管他們執行其子進程,並 所做的更改一個應用程序的數據立即可用另一個, 包括在另一個子進程中執行的任何內容,必須使用外部數據(如數據庫或共享內存)。普通Python模塊中的全局變量 不能用於此目的。
但是在這種情況下,當需要確定應用程序在任何WSGI條件(包括多處理程序條件)下運行時,它會變得非常沉重。
例如,一個包含當前連接用戶數量的簡單變量 - 它應該是過程安全的,從memcached讀取/寫入,還是寫入DB,或者(如果這種不符合標準的庫機制可用)共享內存?
,並且將代碼像
counter = 0
@app.route('/login')
def login():
...
counter += 1
...
@app.route('/logout')
def logout():
...
counter -= 1
...
@app.route('/show_users_count')
def show_users_count():
return counter
行爲無法預測在多處理環境?
謝謝!
引用:「一個包含當前連接用戶數量的簡單變量」。這是HTTP,沒有「連接」用戶的概念,所以這樣的計數不能「簡單」。 (例如,用戶可以通過忘記您提供給他們的任何令牌來註銷 - 例如,通過清除他們的瀏覽器cookie)。 –
這意味着應用程序視爲「連接」的用戶,例如通過上一個HTTP會話時間戳+10分鐘。 –
+1對安德魯的評論,但雖然我同意會話計數的固有困難,但我認爲這與良好的網頁設計有關,而不是特定的多處理/共享數據問題。另一個問題是,沒有代碼來確保計數器正在以有序的方式被讀取,更新和寫回(據我所知,+ = 1不是Python中的原子操作...)。需要某種鎖定。 – marr75