當使用Python2.7 + Apache + mod_wsgi開發小型Web服務器時,我得到了一些不尋常的東西。此服務器的主要用途如下:變量將被實例化多次
- 接收來自其他服務器(服務器A)的常規請求,並將請求正文放入數據庫。
- 使用一些後臺線程來解析數據庫中的請求主體並將解析的信息發送到第三個服務器(服務器B)。
Apache配置爲Windows'winnt'MPM模式。 dispatch.py的代碼,這是切入點,是象下面這樣:
from urlparse import parse_qs
pool = MyThreadClass() # A customized thread class to parse request body in DB
pool.start()
def application(environ, start_response):
# Receiving regular request from server A and put request body into BD
output = 'OK'
start_response('200OK', [('Content-Type', 'text/plain')])
return [output]
在開始的時候,當服務器啓動時,它運行完美創建線程類。然而,幾個小時後,我發現線程類(MyThreadClass)將再次被實例化,這意味着在那一刻,會有後臺運行 MyThreadClass實例。
我不知道在Apache啓動時創建像這樣的實例是否正確。你有什麼想法嗎?
[EDIT1]下面是阿帕奇的WSGI部分的配置:
WSGIScriptAlias/"E:/eclipse workspace/SubscriptionServer/src/business/dispatcher.py"
WSGIPythonPath "E:/eclipse workspace/SubscriptionServer/src"
<Directory "E:/eclipse workspace/SubscriptionServer">
Order deny,allow
Allow from all
</Directory>
[EDIT2]我按照指令@Graham了,並設置loglevel改爲 「信息」。我想我找到了原因,但無法解釋爲什麼!
以下是訪問日誌和錯誤日誌的日誌。我的服務器正在偵聽8080.服務器啓動時會記錄error.log的前三行。然而,在當時16點36分18秒2011訪問日誌,有來自124.237.78.181的呼叫請求http://g.ha99y.com/R.asp?P=123.157.218.85:8080。就在那個時候,在錯誤日誌中,服務器再次加載了dispatcher.py。我無法解釋,這是否呼叫來自,爲什麼它會創建兩個譯員myhost.com:8080 |「和'myhost.com |'。
的access.log:
124.237.78.181 - - [20/Dec/2011:16:36:18 +0800] "GET http://g.ha99y.com/R.asp?P=123.157.218.85:8080 HTTP/1.1" 404 29
error.log中:
[Tue Dec 20 15:50:14 2011] [info] mod_wsgi (pid=1008): Create interpreter 'myhost.com:8080|'.
[Tue Dec 20 15:50:14 2011] [info] mod_wsgi (pid=1008): Adding 'E:/eclipse workspace/SubscriptionServer/src' to path.
[Tue Dec 20 15:50:14 2011] [info] [client 66.220.151.121] mod_wsgi (pid=1008, process='', application='myhost.com:8080|'): Loading WSGI script 'E:/eclipse workspace/SubscriptionServer/src/business/dispatcher.py'.
[Tue Dec 20 16:36:19 2011] [info] mod_wsgi (pid=1008): Create interpreter 'myhost.com|'.
[Tue Dec 20 16:36:19 2011] [info] mod_wsgi (pid=1008): Adding 'E:/eclipse workspace/SubscriptionServer/src' to path.
[Tue Dec 20 16:36:19 2011] [info] [client 124.237.78.181] mod_wsgi (pid=1008, process='', application='myhost.com|'): Loading WSGI script 'E:/eclipse workspace/SubscriptionServer/src/business/dispatcher.py'.
感謝您的答覆。但我百分百確信我沒有做任何代碼更改。因爲我在週末運行代碼而不更改它,並通過日誌發現問題。 –
然後發佈Apache配置的mod_wsgi部分。我能想到的唯一的另一件事是,你以某種方式對同一個腳本進行多重別名,以便可以將它加載到不同的子解釋器中。此實例中的線程類將位於不同的子解釋器中。通過確保在Apache配置中將LogLevel設置爲'info',您可以瞭解這種情況。這樣,mod_wsgi將在WSGI腳本加載/重新加載時以及在哪個子解釋器中記錄。 –
WSGIScriptAlias/「E:/ Eclipse工作區/ SubscriptionServer/SRC /商業/ dispatcher.py」 WSGIPythonPath 「E:/ Eclipse工作區/ SubscriptionServer/SRC」 <指南 「E:/ Eclipse工作區/ SubscriptionServer」> \t訂單拒絕,允許 \t所有 –