2011-08-19 95 views
1

我正在嘗試爲主Pylons進程中的一些繁重計算創建後臺進程。下面的代碼:從Pylons調用的進程()創建叉

p = Process(target = instance_process, \ 
       args = (instance_tuple.instance, parent_pipe, child_pipe,)) 
    p.start() 

過程創建並啓動,但似乎是從主要處理的叉:它聽相同的端口和整個應用程序掛斷。我究竟做錯了什麼?

在此先感謝。

回答

1

過程是一個分叉。如果你仔細觀察它的實現,你會發現Process.start()調用fork。但是,它不會調用任何exec變體來更改執行上下文。

不過,這可能與在同一端口上偵聽無關(除非父進程是多線程的)。程序掛在哪一點? 我知道,當你試圖關閉一個python程序而不終止通過多處理創建的子進程時,它會掛起,直到子進程終止。 例如,如果您不關閉進程之間的管道,可能會導致這種情況。

+0

那麼啓動後臺進程的最佳方式是什麼?或者,也許最好開始一個線程?目標是創建一個進程/線程,它將等待傳入的命令並執行相當長時間的繁重計算。 –

+0

Python線程已經退化。 Python解釋器一次只運行一個執行線程,每100個命令(精確地)切換線程並打印會掛起整個進程(請閱讀python [GIL](http://wiki.python.org/moin/) GlobalInterpreterLock))。我不會推薦Python的線程。 對於進程,計算完成後,您應該簡單地使用'p.terminate()'和'p.join()' – immortal

+0

這些計算可以調用大量數據(500-700 Mb),並且不會每次用戶想要使用它時都可以加載它。我使用subprocess.Popen()函數開始一個進程? –