python多处理池与进程?

时间:2017-05-23 15:27:30

标签: python multiprocessing

在这种情况下只是做菜:

我尝试在多个进程中运行一个函数,这样我就可以在更短的时间内处理一个巨大的文件

我试过

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,它让它映射到函数的两个参数很难看。

我在上面的代码中遗漏了某些内容,或者以这种方式创建的进程(如上所述)是否真的非常简单地运行?

2 个答案:

答案 0 :(得分:3)

加速与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 :(得分: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)

这将使用一些可用的cpus(n_jobs)运行某个函数(random_function)。

随时阅读console.log response (click for image)