2010-04-05 101 views
1

我有一個簡單的django頁面,它上面有一個計數器。 我使用Apache2和mod_wsgi來提供它。在django + apache + mod_wsgi中重播?

首先,當我進入這個頁面時,計數器顯示0,因爲它應該。 第二次當我進入頁面時,計數器顯示1 - 這又是正確的行爲。 現在問題就開始了,當我第三次進入這個頁面時,我再次得到0。

當我刷新它之間的0和1之間,清楚地使用一些緩存左右。 如果我等待一段時間然後再試一次,它會顯示2和3,但會被這些值卡住,直到這個緩存或任何它將被刷新,然後計數器繼續。

有人知道我怎麼才能讓它正常工作(真正的場景涉及從數據庫獲取數據,但這個奇怪的緩存問題是相同的)。

順便說一句,我沒有任何緩存引擎設置在我的django設置。

回答

1

您正在運行Django的多個實例。 Apache隨機連接到其中的一個。

出於測試目的,試試這個在您的apache.conf:

WSGIDaemonProcess mysite processes=1 maximum-requests=500 threads=1 

(您可以在生產中使用多個進程。)

見選項full documentation

+0

謝謝!出於某種原因,我沒有想到這個簡單的答案。 您是否知道如何更改這些實例的數量,以及將實例數量減少到1的後果是什麼? – Adam 2010-04-05 21:44:55

+0

實例數量==進程*線程。如果只有一個實例正在運行,則只能同時提供一個客戶端,這會使您的應用程序對用戶來說很慢,假設有多個併發用戶。 – jholster 2010-04-05 21:53:25

3

實例數!=其他海報建議的進程*線程數。實例數量==僅用於進程。

閱讀:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

可能你正在運行嵌入模式。你應該改用守護進程模式。

不要設置'processes = 1',因爲這是默認設置,並且使用該選項還有其他可能不需要的副作用。

守護進程模式的默認線程數是15,只要您的應用程序是線程安全的,這是很好的。具體來說,訪問您的全局計數器應該是線程安全的。

而且讀:

http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide

其具有如何設置守護程序模式的例子。您需要同時使用WSGIDaemonProcess和WSGIProcessGroup指令,僅僅使用WSGIDaemonProcess是不夠的。

+0

感謝您的信息。說同時服務的clients_ = processes *線程的數量不是正確的嗎? – jholster 2010-04-06 12:21:00

+0

併發請求數量的理論上的最大值是進程*線程,但是進程中的所有線程通常在特定應用程序的相同解釋器實例中運行。閱讀'http://blog.dscpl.com.au/2009/03/python-interpreter-is-not-created-for.html',我想我在這裏談論這種東西。 – 2010-04-06 23:45:49