2017-05-23 119 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