我正在開發一個分析大文件的工具。爲了做到這一點,我引入了多處理,並且一切看起來都很好。爲了做到這一點,我使用multiprocessing.pool創建了N個線程,並處理了我以前創建的不同塊。python多處理。池長時間執行後卡住了
pool = Pool(processes=params.nthreads)
for chunk in chunk_list:
pool.apply_async(__parallel_quant, [filelist, chunk, outfilename])
pool.close()
pool.join()
正如您所看到的,這是標準池執行,沒有特殊用法。
最近我發現一個問題,當我運行一個非常大量的數據。標準執行大約需要2個小時,有16個線程,但我有一個特殊情況需要大約8個小時,因爲它的文件和大小非常大。
的問題是,最近我發現,當我執行這種情況下,執行運行良好,直到終點,大多數孩子的的完成正確,除了一個得到stucked上
<built-in method recv of _multiprocessing.Connection object at remote 0x3698db0>
因爲這個孩子沒有完成父母不會醒來,執行停止。
這種情況只發生在輸入文件非常大時,所以我想知道是否有任何一種默認超時會導致此問題。
我使用Python 2.7 多處理0.70a1
和我的機器是一個CentOS 7(32個核心,64GB RAM)
在此先感謝您的幫助
霍爾迪
我認爲問題在於您不保留結果對象並調用result.get()將結果消息從隊列中拉出。 – tdelaney 2014-12-02 16:16:01
我沒有任何結果。我把結果放在一個pickle文件中,父母讀取並收集它們。 – jvaquero 2014-12-02 17:44:36
無論您的目標函數是否返回值,apply_async總是返回一個ApplyResult對象。我的猜測是結果隊列填滿了子進程塊。如果將結果添加到列表中,然後執行result for result:result.get(),它將沖洗隊列。我不是100%肯定的,所以沒有把它寫成答案。 – tdelaney 2014-12-02 17:53:11