2009-06-05 39 views
2

我一直在試圖跟蹤我的mod_wsgi/Python web應用程序的奇怪問題。我有一個創建對象並調用方法應用處理程序:是mod_wsgi/Python優化的東西嗎?

def my_method(self, file): 
    self.sapi.write("In my method for %d time"%self.mmcount) 
    self.mmcount += 1 

    # ... open file (absolute path to file), extract list of files inside 
    # ... exit if file contains no path/file strings 
    for f in extracted_files: 
     self.num_files_found += 1 
     self.my_method(f) 

在這段開始和結束,我寫

obj.num_files_found 

到瀏覽器。

所以這是一個遞歸函數,它在文件內部的文件引用樹下進行。打印文件中的任何引用,然後打開並檢查這些引用,直到所有文件都是不含文件的葉節點。爲什麼我這樣做並不重要......它更像是一個迂腐的例子。

您所期望的輸出是確定性

Files found: 0 
In my method for the 0 time 
In my method for the 1 time 
In my method for the 2 time 
In my method for the 3 time 
... 
In my method for the n time 
Files found: 128 

而且爲不出所料前幾個請求。然後我得到的,只要下面我刷新

Files found: 0 
In my method for the 0 time 
Files found: 128 

儘管我知道,從以前的刷新,並沒有代碼/文件的改變,它需要ň倍列舉128個文件。

所以,那麼問題:mod_wsgi/Python是否包含內部優化,將停止完整的執行?它猜測輸出是確定性和緩存嗎?

作爲一個說明,在刷新時,如果預期的那樣,REMOTE_PORT每次增加一個......當它使用一個短輸出時,REMOTE_PORT的增量會大幅增加。但可能不相關。

我是新來的Python,溫柔

解決

誰知道這是什麼,但剝開了Apache,mod_python的,mod_wsgi的幾乎一切HTTP相關的和重新安裝固定問題。有些東西是相當壞但現在看起來好像:)

回答

1

「是否mod_wsgi/Python包含內部優化,將停止完成執行?它是否猜測輸出是確定性和緩存?

的問題是(通常情況下),你在你的程序是沒有得到重置你所願的方式有一個全局變量的地方。

有時這可能是無意的,因爲Python會檢查變量的局部名稱空間和全局名稱空間。

您可以 - 無意中 - 具有依賴於某個全局變量的函數。我敢打賭。

你可能看到的是一些mod_wsgi守護進程,每個守護進程都有一個全局變量問題。每個守護進程的第一個請求都有效。那麼你的全局變量處於阻止工作發生的狀態。 [文件打開,頂層目錄變量被覆蓋,誰知道?]

在開始的幾個之後,所有的守護進程都停留在「其他」模式下,他們在沒有做實際工作的情況下報告答案。

+0

的全局變量沒有得到請求之間復位? – 2009-06-05 19:40:51

+0

@Aiden Bell:好點。澄清需要。 – 2009-06-05 19:45:23

1

看來Python/mod_wsgi安裝必須被破壞。我從來沒有見過這樣奇怪的錯誤。 痕跡旁邊的回報:

self.sapi.write("Returning at line 22 for call %d"%self.times_called) 
return someval 

似乎發生了許多時間:

返回在22行呼叫3

在22行返回呼叫3

在行返回22致電3

任何東西的控制流中都沒有一致的邏輯:(我也很確定我可以編寫簡單的遞增代碼來計算一個方法被調用的次數。絕對的,令人沮喪的,廢話。我甚至在sapi.write()的每個調用旁邊放置了epoch時間,以確保它不會盲目重複代碼。它們是獨一無二的:S

時間撕掉Apache,Python,mod_wsgi和其餘,然後重新開始。

解決

誰知道這是什麼,但剝開了Apache,mod_python的,mod_wsgi的幾乎一切HTTP相關的和重新安裝固定的問題。有些東西是相當壞,但現在看起來好像:)

3

Apache/mod_wsgi可能在多進程/多線程配置中運行可以跳過代碼,假設它是在單個進程中運行,與該過程可能是單線程的。爲了什麼,所有的手段對共享數據的不同配置的可能性的討論,請參見:

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