5

我在 Ubuntu 12.04 上的 Python 中使用 multiprocessing.Pool,我遇到了一个奇怪的问题;当我调用map_async我的 Pool 时,我生成了 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是一个包装函数,用于将必要的参数传递给一个类。self

所有三台计算机都使用 Python 2.7.3,我真的不知道从哪里开始寻找为什么那台 Ubuntu 计算机出现故障。关于如何开始缩小问题范围的任何帮助都会有所帮助。谢谢!

4

2 回答 2

2

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

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

于 2014-11-10T21:30:54.063 回答
1

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

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()
于 2019-03-05T21:44:50.603 回答