Python中的multiprocessing.dummy未能充分利用100% CPU

47 投票
1 回答
40030 浏览
提问于 2025-04-28 04:39

我正在用Python做一个机器学习项目,所以我需要在我的程序中实现一个并行预测的功能。

from multiprocessing.dummy import Pool
from multiprocessing import cpu_count


def multi_predict(X, predict, *args, **kwargs):
    pool = Pool(cpu_count())
    results = pool.map(predict, X)
    pool.close()
    pool.join()
    return results

问题是我所有的CPU使用率只有20%到40%(总共加起来是100%)。我使用的是multiprocessing.dummy,因为我在使用multiprocessing模块时遇到了一些关于序列化(pickling)函数的问题。

暂无标签

1 个回答

97

当你使用 multiprocessing.dummy 时,其实是在用线程,而不是进程:

multiprocessing.dummy 的功能和 multiprocessing 是一样的,但它只是对 threading 模块的一个封装。

这意味着你会受到 全局解释器锁(GIL) 的限制,实际上一次只能有一个线程在执行需要大量计算的操作。这会让你无法充分利用你的 CPU。如果你想要在所有可用的核心上实现完全的并行处理,你需要解决在使用 multiprocessing.Pool 时遇到的序列化问题。

需要注意的是,如果你要并行处理的工作是输入输出(IO)密集型的,或者使用了释放 GIL 的 C 扩展,那么 multiprocessing.dummy 可能仍然有用。不过对于纯 Python 代码,你还是需要用 multiprocessing

撰写回答