在这种情况下只是菜鸟:
我尝试在多个进程中运行一个函数,这样我就可以在更短的时间内处理一个巨大的文件
我试过了
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,让它将两个参数映射到函数是很丑陋的。
我在上面的代码中是否遗漏了一些东西,或者以这种方式创建的进程(如上面一样(运行得非常平行?
加速比与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))
我也不是专家,但你应该尝试使用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(。
随意阅读文档!