Python多处理故障排除

Mic*_*hal 2 python macos multiprocessing python-3.x

最近我想使用并行处理加速我的一些代码,因为我有一个四核i7,它似乎是浪费.我学习了python(我使用v 3.3.2,如果它匹配)GIL以及如何使用多处理模块克服它,所以我写了这个简单的测试程序:

from multiprocessing import Process, Queue

def sum(a,b):
    su=0
    for i in range(a,b):
        su+=i
    q.put(su)

q= Queue()

p1=Process(target=sum, args=(1,25*10**7))
p2=Process(target=sum, args=(25*10**7,5*10**8))
p3=Process(target=sum, args=(5*10**8,75*10**7))
p4=Process(target=sum, args=(75*10**7,10**9))

p1.run()
p2.run()
p3.run()
p4.run()

r1=q.get()
r2=q.get()
r3=q.get()
r4=q.get()

print(r1+r2+r3+r4)
Run Code Online (Sandbox Code Playgroud)

使用cProfile测量的代码运行大约48秒,但是单个进程代码

def sum(a,b):
    su=0
    for i in range(a,b):
        su+=i
    print(su)

sum(1,10**9)
Run Code Online (Sandbox Code Playgroud)

在大约50秒内运行.我知道这种方法有开销,但我预计改进会更加激烈.fork()的错误不适用于我,因为我在Mac上运行代码.

aba*_*ert 6

问题是你打电话run而不是打电话start.

如果您阅读文档,run则是"表示流程活动的方法",start而是在后台流程上启动流程活动的功能.(这跟threading.Thread.一样.)

所以,你正在做的是sum在主进程上运行函数,而不是在后台进程上做任何事情.

从笔记本电脑的定时测试开始,这将时间缩短到原来的37%.不是你希望的25%,我不确定为什么,但......足以证明它真的是多处理.(那个,以及我Python使用60-100%CPU 获得四个额外进程的事实......)