多处理不起作用

时间:2014-08-11 12:02:10

标签: python multiprocessing

我正在使用系统监视器报告的8 CPU3处理Ubuntu 12。

测试代码是

    import multiprocessing as mp

    def square(x):
        return x**2


    if __name__ == '__main__':
        pool=mp.Pool(processes=4)
        pool.map(square,range(100000000))
        pool.close()
        # for i in range(100000000):
        #    square(i)

问题是:

1)尽管已启动多个进程,但所有工作负载似乎只安排在一个核心上,接近100%的利用率。有时,所有工作负载都会迁移到另一个核心,但工作负载永远不会在它们之间分配。

2)没有多处理更快

    for i in range(100000000):
        square(i)

我在stackoverflow上读过类似的问题: Python multiprocessing utilizes only one core

仍然没有应用结果。

3 个答案:

答案 0 :(得分:2)

您正在使用的功能太短(即没有足够的时间来计算),因此您将所有时间都花在了进程之间的同步上,这必须以串行方式完成(为什么不在单个处理器上)。试试这个:

import multiprocessing as mp


def square(x):
    for i in range(10000):
         j = i**2
    return x**2


if __name__ == '__main__':
    # pool=mp.Pool(processes=4)
    # pool.map(square,range(1000))
    # pool.close()
    for i in range(1000):
        square(i)

你会发现突然多处理效果很好:完成需要大约2.5秒,没有它需要10秒。

注意:如果使用python 2,您可能希望将所有range替换为xrange

修改:我将time.sleep替换为CPU密集型但无用的计算

附录:通常,对于多CPU应用程序,您应该尝试让每个CPU尽可能多地工作而不返回相同的进程。在像你这样的情况下,这意味着将范围分成几乎相同大小的列表,每个CPU一个,并将它们发送到各种CPU。

答案 1 :(得分:1)

当你这样做时:

pool.map(square, range(100000000))

在调用map函数之前,它必须创建一个包含 100000000 元素的列表,这是由一个进程完成的,这就是为什么你看到一个核心的原因工作

使用生成器,所以每个核心都可以弹出一个数字,你应该看到加速:

pool.map(square, xrange(100000000))

答案 2 :(得分:0)

仅导入多处理库以利用多个流程来安排工作是不够的。你实际上也必须创建进程!

您的工作目前安排在一个核心,因为您还没有这样做,所以您的程序是一个单一线程的进程。

当然,当你开始一个新的过程来简单地对数字进行平方时,你的性能会变慢。创建进程的开销确保了这一点。因此,您的流程池可能需要比单个流程运行更长的时间。