2012-06-28 26 views
0

我試圖使用PyDev中使用多處理模塊的組件,但在運行代碼時產生了100s的問題在操作系統中的python進程和殺死我的機器。我有我的代碼調用run()而不是start(),並且它工作正常(當然,除了所有單線程,因爲start()實際上是生成進程),所以這表明我的代碼至少沒有做任何瘋狂的事情像無限生成進程或其他東西。此外,我把一些測試代碼放在一起,看看結果如何:單個調用multiprocessing.Process.start()在PyDev中運行時在Windows中產生100個進程

from multiprocessing import Process 
import time 

def create_processes(num_processes, method, *args): 

    processes = [] 
    for i in range(num_processes): 
     processes.append(Process(target=method, args=args)) 
    return processes 

def start_all(processes, stagger): 

    for process in processes: 
     process.start() 
     if stagger: 
      time.sleep(stagger) 

processes = create_processes(2, time.sleep, 4) 
start_all(processes, 0) 

當我在cli中運行它時,它工作正常;它產生了2個新的進程,在超時之後結束。但是,當我在PyDev中運行它時,它會生成約600個進程(或者至少這是在我的機器無響應之前顯示多少個任務管理器)。我做了一些調試,似乎在Process.start()上線self._popen = Popen(self)炸燬。

我做了一些四處搜尋,但無法找到任何看起來相關的東西。 CLI是否將所有的start() ed進程自動分配給一些單獨的管理器以保持繮繩?我是否需要我的代碼中的一個線程來join()所有我的進程? PyDev是否會嘗試維護日誌和控制?還有其他事情嗎?

回答

3

如果是這樣的出發點來的代碼,你應該換行的最後兩行if __name__ == '__main__'爲了防止子進程從各自的子過程:

if __name__ == '__main__': 
    processes = create_processes(2, time.sleep, 4) 
    start_all(processes, 0) 
+0

哦,我想我明白了。所以你說的是,當我從文件運行時,當派生進程導入模塊以獲取它正試圖調用的方法時,它正在重新執行進程創建代碼?但是產生的孩子們看到他們的'__name__'是什麼? –

+0

從[python docs](http://docs.python.org/tutorial/modules.html):「在模塊中,模塊的名稱(作爲字符串)可用作全局變量'__name__'的值「。所以如果你的模塊名爲fido.py,'__name__'就是'fido''。只有當你將模塊作爲腳本執行時,__name__'被設置爲''__main __''。 – Trevor

+0

哦。這現在有很多明顯的意義。我不敢相信這麼長時間以來我對此感到震驚......謝謝。 –

相關問題