2012-04-06 60 views
0

我有一個使用python多進程的程序。我發現在主程序中創建的所有進程都可以完成,但主程序始終在等待返回值,並且無法停止。有人可以給我一些關於如何解決這個問題的建議嗎?進程無法停止在python多處理池中

的代碼片段如下:

主程序:

workers = multiprocessing.Pool(4) 
args = [arg1, arg2, arg3, arg4] 
results = workers.map(subfunc, args) 
print "we are in main functions " 

subfunc(* ARG)

# doing some other jobs 
result = {.....} # a large dictionary 
print 'done with sub functions' 
return result # if I change it to "return 1", it can finish successfully 

我可以看到 「通過子功能完成」 對所有的輸出主要創建的過程,但沒有輸出「我們在主要功能」。任何人都可以幫我弄清楚這個問題嗎?

+2

你可以測試,以符合結果有一個長度? Mayhap這種行爲是由於永遠不執行循環。 – mklauber 2012-04-06 19:57:42

+0

它可能是結果字典有遞歸引用,並使其成爲一個泡菜沒有完成。嘗試將它寫出來作爲pickle或json的標準輸出。 – j13r 2012-04-06 21:38:39

+0

這就是我現在所做的,它的工作原理。謝謝 – hanqiang 2012-04-18 19:14:57

回答

2

subfunc返回結果後,子進程仍然需要清理結果並通過進程間通信發送給主進程。所以他們在子進程實際上準備終止之前打印「完成」。

您可以嘗試僅返回"fake"以確定問題所在,然後考慮如何更快速地在流程之間交流結果。例如,根據列表的內容,您可能能夠以更緊密的格式打包內容,或者可能共享內存是一個可行的選項。

+0

如果我在子函數中返回「1」,主程序可以成功終止。所以現在我認爲這個問題可能是由返回值的大小造成的。在我的程序中,subfunc的返回值可能高達1 GB。你如何看待它? – hanqiang 2012-04-06 21:36:21

+0

@hanqiang是的,那可能就是這樣。它是什麼樣的數據?您可能希望通過其他方式將其從工作人員傳達給主人,也許可以通過共享內存,[內存映射文件](http://docs.python.org/library/mmap.html),數據庫,簡單的舊文件I/O,東西。 – Dougal 2012-04-06 21:53:08

+0

哇......我花了好幾個小時試圖弄清爲什麼我的孩子進程告訴我他們已經完成了,但事情似乎只是凍結。事實證明,這酸洗正在發生,我只需要等待。 – CodeGuyRoss 2017-02-11 00:13:45