multiprocessing.Pool进程锁定到单个核心

时间:2012-09-25 22:26:39

标签: python multiprocessing

我在Ubuntu 12.04上使用Python中的multiprocessing.Pool,我遇到了一个奇怪的问题;当我在我的池上调用map_async时,我会产生8个进程,但是他们都在为我的8核机器的单个核心争夺统治权。完全相同的代码占用了我的Macbook Pro中的两个核心,以及我的其他Ubuntu 12.04桌面的所有四个核心(在所有情况下都使用htop进行测量)。

我的代码太长了,无法发布所有内容,但重要的部分是:

P = multiprocessing.Pool()
results = P.map_async( unwrap_self_calc_timepoint, zip([self]*self.xLen,xrange(self.xLen)) ).get(99999999999)
P.close()
P.join()
ipdb.set_trace()

其中unwrap_self_calc_timepoint是一个包装函数,用于根据this article的建议将必要的self参数传递给类。

所有三台计算机都在使用Python 2.7.3,我真的不知道从哪里开始寻找为什么一台Ubuntu计算机正在运行。任何有关如何开始缩小问题的帮助都会有所帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

我有同样的问题,在我的情况下,解决方案是告诉linux在整个处理器上工作而不只是一个:尝试在代码的开头添加以下两行:

import os os.system("taskset -p 0xfffff %d" % os.getpid())

答案 1 :(得分:0)

在numpy和某些Linux发行版之间,这似乎是一个相当普遍的问题。在程序开始前,我没有使用Taskset碰运气,但是在要并行化的代码中使用它确实可以解决问题:

import multiprocessing as mp
import numpy as np
import os

def something():
    os.system("taskset -p 0xfffff %d" % os.getpid())
    X = np.random.randn(5000,2000)
    Y = np.random.randn(2000,5000)
    Z = np.dot(X,Y)
    return Z.mean()

pool = mp.Pool(processes=10)
out = pool.map(something, np.arange(20))
pool.close()
pool.join()