在常規應用程序(如Windows)中,當在全局級別上創建對象/變量時,整個程序在整個程序運行期間都可用。python中的apache/modwsgi應用程序的內存模型?
在以PHP編寫的Web應用程序中,所有變量/對象在腳本末尾被銷燬,因此所有內容都必須寫入數據庫。
a)那麼python運行在apache/modwsgi下呢?這在記憶方面如何工作?
b)如何創建持久存在於網頁請求之間的對象,以及如何確保apache/modwsgi中沒有線程問題?
在常規應用程序(如Windows)中,當在全局級別上創建對象/變量時,整個程序在整個程序運行期間都可用。python中的apache/modwsgi應用程序的內存模型?
在以PHP編寫的Web應用程序中,所有變量/對象在腳本末尾被銷燬,因此所有內容都必須寫入數據庫。
a)那麼python運行在apache/modwsgi下呢?這在記憶方面如何工作?
b)如何創建持久存在於網頁請求之間的對象,以及如何確保apache/modwsgi中沒有線程問題?
所有Python全局變量都是在模塊導入時創建的。重新導入模塊時使用相同的全局變量。
Python Web服務器不執行線程,但是預分叉的進程。因此Apache不存在線程問題。
Apache下的Python進程的生命週期依賴於。 Apache設置了多少個子進程的產生,保留和殺死。這意味着您可以在Python進程中使用全局變量來進行緩存(進程內緩存),但該進程可能在任何請求後終止,因此您無法在全局變量中放入任何持久數據。但是這個過程並不一定需要終止,在這方面,Python比PHP更有效率(對於每個請求都不會解析源代碼 - 但是您需要讓服務器處於重載模式以在開發過程中讀取源代碼更改) 。
因爲全局進程是每個進程,並且可以有N個進程,所以這些進程使用像memcached這樣的機制共享「web服務器全局」狀態。
通常的Python全局只包含進程初始化
緩存數據(會話/用戶中性)期間設置
設置變量
去閱讀來自官方以下mod_wsgi文檔:
http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading
它解釋了可以運行的各種模式,並給出了關於數據範圍和共享的一般指導。
我認爲預分叉或線程模式依賴於Apache的安裝和配置,或者你指的是別的嗎? – confusionz
PRe-forked是Python的首選方法。你可以做線程安裝,但是Python不喜歡線程。長答案:http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/ –
對Python Web應用程序使用線程很好。大多數情況下,應用程序都停留在等待I/O,所以GIL不是人們發現的問題。 GIL對於需要高CPU的任務更爲不利。閱讀http://blog.dscpl.com.au/2007/09/parallel-python-discussion-and-modwsgi.html和http://blog.dscpl.com.au/2007/07/web-hosting-景觀和modwsgi.html –