2017-05-23 161 views
1

擺明菜鳥在此背景下:python多處理池vs進程?

我嘗試在多個進程中運行的一個功能,這樣我就可以在較短的時間

我試圖

for file_chunk in file_chunks: 
    p = Process(target=my_func, args=(file_chunk, my_arg2)) 
    p.start() 
    # without .join(), otherwise main proc has to wait 
    # for proc1 to finish so it can start proc2 

,但它似乎不處理一個巨大的文件所以真的很快

現在我問自己,如果它真的是平行運行的工作。我也考慮過Pool,但我使用python2,並且使它將兩個參數映射到該函數是醜陋的。

我在上面的代碼中丟失了某些東西,或者以這種方式創建的進程(如上所述)運行真正平行嗎?

+0

你預計會處理多少塊?你在這裏紡織了數百個新工藝嗎?池允許您創建一定數量的工作人員,並將該組塊(任務)分配給工作人員,而不會使系統過載。 – svohara

+0

@svohara我只有20個塊,所以我可以實現20倍的處理速度,這個代碼沒有發生。 – doniyor

回答

2

加速比例與PC的CPU核心數量成正比,而不是成塊數量。

理想情況下,如果您有4個CPU核心,則應該看到4倍加速。在考慮性能改進時,還必須考慮其他因素,例如IPC開銷。

產生太多的進程也會對你的性能產生負面影響,因爲它們將相互競爭CPU。

我建議使用multiprocessing.Pool來處理大部分邏輯。如果您有多個參數,請使用apply_async方法。

from multiprocessing import Pool 

pool = Pool() 

for file_chunk in file_chunks: 
    pool.apply_async(my_func, args=(file_chunk, arg1, arg2)) 
1

我不是一個專家要麼,但你應該嘗試使用joblib並行

from joblib import Parallel, delayed 
import multiprocessing as mp 

def random_function(args): 
    pass 

proc = mp.cpu_count() 

Parallel(n_jobs=proc)(delayed(random_function)(args) for args in args_list) 

這將運行使用大量可用CPU(n_jobs)的某些功能(random_function)。

隨意閱讀docs

+0

很酷的東西thnx。不知道 – doniyor