在这种情况下只是做菜:
我尝试在多个进程中运行一个函数,这样我就可以在更短的时间内处理一个巨大的文件
我试过
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 :(得分: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)。