2015-07-01 75 views
4

我想了解Python的multiprocessing.Pool對象的最佳做法。我應該每次創建一個新的Pool對象還是重用一個對象?

在我的程序中,我經常使用Pool.imap。通常,每次我並行開始任務時,都會創建一個新的池對象,然後在完成後關閉它。

我最近遇到一個掛起,其中提交給池的任務數量少於進程數量。奇怪的是,它只發生在我的測試管道中,其中有一些東西在它之前運行。將測試作爲獨立運行並不會導致問題。我認爲這與製作多個游泳池有關。

我真的很想找一些資源來幫助我理解使用Python多處理的最佳實踐。具體而言,我目前正試圖瞭解製作多個池對象與僅使用其中一個的含義。

+0

你是說你創建一個工作線程池,然後關閉並加入。之後你創建另一個工作線程池,關閉並加入,但它永遠不會結束?你可以在一個簡短的Python腳本中重現嗎?您只能通過https://docs.python.org/2/library/multiprocessing.html#multiprocessing-programming和https://docs.python.org/2/library/multiprocessing中的指導原則在其線程中訪問池本身。 html#使用a-pool-of-workers –

+0

我有類似的問題。我在一個循環內部運行一個循環,其中內部循環與Pool.imap並行。它可以工作很多次,具體取決於我提供功能的數據。但大多數情況下,它最終會掛起而沒有錯誤信息。我一直在試圖調試它,但一直未能找出原因。 –

回答

4

當您創建工作進程池時,將從父進程生成新進程。這是一個非常快的操作,但它有成本。

因此,只要您沒有很好的理由,例如由於一名工作人員意外死亡而導致池中斷,最好始終使用同一個Pool實例。

不檢查代碼很難說明掛起的原因。您可能沒有正確地清理先前的實例(調用close()/ stop(),然後始終調用join())。您可能通過Pool通道發送了太大的數據,這通常會導致死鎖等問題。

如果您提交的任務少於工作人員,那麼池肯定不會中斷。池的設計正是爲了將工作人員的數量與任務數量分開。

相關問題