首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多处理不起作用

多处理不起作用
EN

Stack Overflow用户
提问于 2014-08-11 12:02:09
回答 3查看 461关注 0票数 0

正如系统监视器所报告的那样,我正在用8 CPU3开发Ubuntu 12。

测试代码是

代码语言:javascript
复制
    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)没有多处理是更快的

代码语言:javascript
复制
    for i in range(100000000):
        square(i)

我读过类似的关于堆栈溢出的问题,比如:Python multiprocessing utilizes only one core

仍未得到应用结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-11 12:12:44

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

代码语言:javascript
复制
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秒。

注意:如果使用python2,您可能需要用xrange替换所有range

编辑:i用CPU密集型但无用的计算取代了time.sleep

增编:一般情况下,对于多CPU应用程序,您应该尽量让每个CPU完成尽可能多的工作,而不返回到相同的进程。在像您这样的情况下,这意味着将范围划分为几乎相等大小的列表,每个CPU一个,并将它们发送到各个CPU。

票数 2
EN

Stack Overflow用户

发布于 2014-08-11 12:17:37

当你这样做时:

代码语言:javascript
复制
pool.map(square, range(100000000))

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

使用生成器代替,这样每个核心都可以弹出一个数字,您应该看到加速比:

代码语言:javascript
复制
pool.map(square, xrange(100000000))
票数 1
EN

Stack Overflow用户

发布于 2014-08-11 12:15:41

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

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

当然,当你开始一个新的过程,只是简单的平方,你会得到更慢的性能。流程创建的开销确保了这一点。因此,您的进程池很可能比单进程运行花费更长的时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25242820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档