Python多进程池(Pool)和进程(Process)有什么区别?

4

在这个背景下,当我尝试运行一个函数的时候,我是一个萌新。

我想启动多个进程来运行这个函数,以便能够在更短的时间内处理大型文件。

我已经尝试过:

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

但似乎速度还不够快。

现在我在思考,它是否真的并行运行作业。我也考虑过池,但我正在使用Python2,让它映射两个参数到函数很丑陋。

我在上面的代码中有什么遗漏或这种方式创建的进程(如上所述)确实并行运行吗?


1
你预计要处理多少个块?你会在这里启动数百个新进程吗?使用池可以让你创建一组工作程序并将任务分配给这些工作程序,而不会过载你的系统。 - svohara
@svohara 我只有20个块,所以我可以实现20倍的加速处理,但这段代码并没有实现。 - doniyor
2个回答

9
加速比与 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))  

3

虽然我不是专家,但你可以尝试使用joblib Parallel来提高效率。

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)。

欢迎阅读文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接