多进程池(multiprocessing.Pool)被锁定在单个核心上。

5
我正在Ubuntu 12.04上使用Python中的multiprocessing.Pool,并且遇到了一个奇怪的问题。当我在我的Pool上调用map_async时,我会生成8个进程,但它们都在争夺我8核机器上的单个核心。完全相同的代码在我的Macbook Pro上使用两个内核,在另一台Ubuntu 12.04桌面上使用4个内核(如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 是一个包装函数,用于传递必要的 self 参数到一个类中,基于这篇文章的建议。

所有三台电脑都使用 Python 2.7.3,我不知道从何处开始查找为什么那台 Ubuntu 电脑出现问题。任何有关如何开始缩小问题范围的帮助都将是有益的。谢谢!


你在htop中看到了什么? - Ruggero Turra
它显示了8个Python进程,每个进程运行在12%的CPU利用率下,并且有1个核心已经达到了100%的最大利用率。 - staticfloat
我遇到了完全相同的问题。我的代码在 Ubuntu 10.10 上使用了所有 8 个可用核心,但在升级到 12.04 后只使用了 1 个核心。你找到了任何解决方案吗? - user1084871
2
还没有,我放弃了在Python中尝试多进程处理,转而在Julia中编写算法,获得了所需的速度。 - staticfloat
2个回答

2

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

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


这意味着您的系统或进程在其他设置中偏移了亲和力。无论如何,检查亲和力的建议是一个好主意。 - ivan_pozdeev

2
这似乎是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()

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