我正在使用系统监视器报告的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
仍然没有应用结果。
答案 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)
仅导入多处理库以利用多个流程来安排工作是不够的。你实际上也必须创建进程!
您的工作目前安排在一个核心,因为您还没有这样做,所以您的程序是一个单一线程的进程。
当然,当你开始一个新的过程来简单地对数字进行平方时,你的性能会变慢。创建进程的开销确保了这一点。因此,您的流程池可能需要比单个流程运行更长的时间。