Python中的multiprocessing.dummy未能充分利用100% CPU
我正在用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
。