正如系统监视器所报告的那样,我正在用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)我读过类似的关于堆栈溢出的问题,比如:Python multiprocessing utilizes only one core
仍未得到应用结果。
发布于 2014-08-11 12:12:44
您所使用的函数太短(即计算所需的时间不够),因此您将所有的时间都花在进程之间的同步上,这必须以串行的方式完成(为什么不在单个处理器上)。试试这个:
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。
发布于 2014-08-11 12:17:37
当你这样做时:
pool.map(square, range(100000000))在调用map函数之前,它必须创建一个包含100000000个元素的列表,这是由一个进程完成的,这就是为什么您看到一个单独的核心工作。
使用生成器代替,这样每个核心都可以弹出一个数字,您应该看到加速比:
pool.map(square, xrange(100000000))发布于 2014-08-11 12:15:41
仅仅导入多处理库来利用多个进程来安排您的工作是不够的。您实际上也必须创建流程!
您的工作目前安排在单个核心上,因为您还没有这样做,所以您的程序是一个具有单个线程的进程。
当然,当你开始一个新的过程,只是简单的平方,你会得到更慢的性能。流程创建的开销确保了这一点。因此,您的进程池很可能比单进程运行花费更长的时间。
https://stackoverflow.com/questions/25242820
复制相似问题