2012-07-03 36 views
3

我有一個我正在使用的工具,我需要它來運行解析器並輸出另一個分析日誌。目前我擁有它,所以它通過網絡界面。Python子流程Popen失速CGI頁面

  1. 用戶進入的形式和(已在文件系統)提交的文件名解析。
  2. 表單將信息提交給Python CGI腳本
  3. Python CGI腳本運行併產生一個子進程來運行解析。
  4. 解析器找到適用於分析的信息並生成子進程。

我使用

import subprocess 
... 
subprocess.Popen(["./program.py", input]) 

在我的代碼,我從文檔,我們沒有在子進程等待終止假設,我們只是不停地運行該腳本。啓動這一切我的CGI腳本的作用:

subprocess.Popen(["./program.py", input]) 
// HTML generation code 
// Javascript to refresh after 1 second to a different page 

的HTML代碼生成的輸出只是我們處理的請求,然後JavaScript的刷新頁面到主主頁的狀態。

的問題

的CGI頁面掛起,直到子進程完成,這不是我想要的。我認爲Popen不會等待子流程完成,但是每當我運行這個工具時,它都會停止,直到它完成。我希望腳本完成並讓子進程在後臺運行,並讓網頁仍然正常運行,而用戶不會認爲所有內容都只是通過加載信號停滯。

我似乎無法找到任何理由爲什麼Popen會這樣做,因爲我讀過它的每一個地方說它不會等待,但它似乎。

奇怪的還有一點是,apache日誌顯示:「請求正文讀取超時」以及腳本完成之前。那麼Apache是​​否真的拖延了腳本呢?

對不起,我不能顯示完整的代碼,因爲它是「機密的」,但希望邏輯有待理解。

回答

1

Apache大概等待子進程完成。你可以嘗試妖魔化孩子(雙叉,setsid)或更好的只是提交作業到本地服務,例如,通過寫入預定義文件或使用一些消息代理或通過更高級別的接口,如芹菜

+0

謝謝,我想了很多,然後我很早就偶然發現了這個線程,現在我決定嘗試去完成他們對Popen的全部命令:http://stackoverflow.com/questions/546017/how -do-i-run-another-script-in-python-without-wait-for-it-to-finish由於某種原因,它現在可以工作。包括stdout和stderr參數似乎允許腳本結束,而不是等待子進程。謝謝! – richardhsu

1

不確定究竟爲什麼這個工作,但我跟着這個線程的答案: How do I run another script in Python without waiting for it to finish?

要做到:

p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT) 

相反的:

p = subprocess.Popen([sys.executable, '/path/to/script.py']) 

由於某種原因,現在CGI腳本將終止並且子進程繼續運行。 任何有關爲什麼有差異的見解會有幫助嗎?我不明白爲什麼必須定義其他兩個參數會導致這樣的失速。

+0

如果script.py生成足夠的輸出可能會阻塞。將stdin,stdout,stderr重定向爲devnull,[示例](http://stackoverflow.com/a/11270665/4279)。 'close_fds = True'在POSIX系統上不會受到傷害。你確定你的代碼有效嗎? – jfs

+0

是的,CGI腳本不再具有加載符號,並且Apache日誌不再顯示「請求正文讀取超時」。我認爲同樣的,如果我指定了標準輸出,但是顯然添加了那些似乎可以修復它的東西,會有一些阻塞。沒有做其他更改:/ – richardhsu