2016-07-21 65 views
0

至於多的螺紋和多進程池是必要的,使代碼安全?如果沒有他們會產生什麼壞結果?多的螺紋和多進程池在<code>multiprocessing</code></p> <pre><code>pool = Pool() result = pool.map(func, arg) pool.close() pool.join() </code></pre> <p>爲什麼<code>close</code>和<code>join</code>多處理

在循環中,最好將這些行放在循環內部還是外部?

例如,

pool = Pool() 
for x in a_ndarray: 
    result = pool.map(func, x) 
    save(result) 
    pool.close() 
    pool.join() 

pool = Pool() 
for x in a_ndarray: 
    result = pool.map(func, x) 
    save(result) 
pool.close() 
pool.join() 

我看到其他人則建議爲IO密集型任務CPU密集型任務和多螺紋多進程。但是,將多線程應用於CPU限制和多進程限制IO限制的缺點是什麼?

回答

1

@Lee嗨民間,

基本上,這些指令會設置一些封閉的概念到當前執行,它會說:「我不會把更多的數據放入隊列(close),我會等待(join)「之前的子流程結束。

從文檔:

接近()

指示沒有更多的數據將被當前>過程中把此隊列。一旦將所有緩衝數據刷新到管道,後臺線程將退出。這在隊列被垃圾收集時自動調用。


join()方法

塊,直到隊列中的所有項目已得到和處理。

每當將項目添加到隊列中時,未完成任務的數量就會增加。只要消費者線程調用task_done()來指示該項目已被檢索並且所有項目都已完成,則計數就會下降。當未完成任務的計數降至零時,join()將取消阻止。

來源:

這將使更好,更安全的代碼,因爲它會利用這些信息做一個適當的垃圾收集並會避免這樣結束的代碼怪異或不想要的行爲子進程結束之前的主進程。

例如,如果以後啓動子過程調用,可以在執行一次有所不同的功能:

pool = Pool() 
for x in a_ndarray: 
    result = pool(func, x) 
    save(result) 
non_fixed_time_function() #this could take 0.1 s or 2 hours. 
#pool.join() # Don't wait for child to finish 

如果你不等待子完成,在執行能做到完全一樣你想在其他人可能只完成一個孩子或兩個孩子,這會造成奇怪的結果。

關於你的第二個問題,在這種情況下,我會在循環中採用.close().join()方法,然後保存結果。

+0

我得到'close'和'join'對釋放池資源非常有用。但是由於'map'本身阻塞直到結果準備好,爲什麼'close'和'join'是必要的? 'non_fixed_time_function'是否啓動了一些其他與'pool'相關或不相關的子進程?如果不相關,'join'可以監視任何子進程? – Lee

+0

對不起,您在哪裏使用過'map' ?,關於您發佈的代碼,除非明確使用'join',否則它不會自行阻止。 –

+0

對不起,應該是Q中的'pool.map()',而不是'pool()'。 – Lee