2011-11-01 108 views
12

在發佈之前,我已經在線閱讀了很多資源,其中包括mod_wsgi wiki,但我對Apache進程/線程與mod_wsgi的交互方式感到困惑。Apache + mod_wsgi交互

這是我目前的理解:Apache可以配置爲運行,以便一個或多個子進程可以處理傳入的請求,並且可以配置這些子進程中的每個進而使用一個或多個線程來處理請求。之後,事情開始變得對我朦朧。我的疑惑是:

  1. 什麼是WSGIDaemonProcess,以及究竟是誰使用Python解釋器分我叫Django應用程序?
  2. 如果我的Django應用程序運行在允許多個線程在一個Apache子進程中的模式下 - 這是否意味着多個請求可以同時訪問我的應用程序?如果是這樣 - 將設置一個模塊級變量(比如用戶的ID)可能會被其他並行請求覆蓋並導致非線程安全行爲?
  3. 對於上面的情況,使用Python的全局解釋器鎖定,線程是否會實際並行執行?

回答

10

回答每個要點。

1 - WSGIDaemonProcess/WSGIProcessGroup指示mod_wsgi應該在單獨的進程中運行WSGI應用程序的fork。這是一個fork而不是fork/exec,所以mod_wsgi仍然在控制它。當檢測到一個URL映射到一個WSGI應用在守護進程模式,在Apache子工作進程,然後mod_wsgi的代碼運行將代理通過對守護進程模式的過程,其中的mod_wsgi代碼就有記載,並調出到你的WSGI請求細節應用。

2 - 是的,多個請求可以同時運行並希望在同一時間修改模塊中的全局數據。

3 - 對於執行是內Python本身則沒有,它們並不嚴格平行作爲全局解釋鎖定裝置只有一個線程可在一個時間執行Python代碼運行的時間。 Python解釋器會定期切換哪個線程正在運行。如果其中一個線程調用C代碼並釋放GIL,那麼至少在該線程處於該狀態時,它可以與其他線程(以Python或C代碼運行)並行運行。作爲例子,當呼叫被製成向下到Apache/mod_wsgi的層,以寫回響應數據時,GIL被釋放。這意味着實際回寫下層的響應數據並不妨礙其他線程運行。