Windows和Linux之间的Python多进程差异
我有一个名为jobrunner.py的脚本,该脚本在main.py中调用类方法.见下文...
I have a script called jobrunner.py that calls class methods in main.py. See below...
# jobrunner.py
from multiprocessing import Process
import main
from main import BBOX
def _a(arg):
f = main.a()
print f.run()
def _b(arg):
p = main.b()
print p.run()
if __name__ == '__main__':
world = '-180,180,-90,90'
BBOX.append(world.split(','))
p1 = Process(target=_a, args=("1",))
p2 = Process(target=_b, args=("1",))
p1.start()
p2.start()
p1.join()
p2.join()
在OSX和Ubuntu上调用进程_a和_b时没有任何问题,但是当我尝试在Windows(相同版本的python和所有版本)上运行相同的东西时,它不能说索引超出范围.这使我相信在Windows平台上的模块之间未设置或传递全局"变量BBOX.有没有其他人看到过这样的东西,并且知道如何解决?
Processes _a and _b are invoked without any problems on OSX and Ubuntu but when I try to run the same thing on Windows (same version of python and all), it fails saying that index is out of range. This leads me to believe that the "global" variable BBOX is not being set or passed between modules on the Windows platform. Has anyone else seen something like this and know how to fix it?
亚当
更新:即使是完全骇客,我也想出了办法...请见下文!
UPDATE: I figured it out even though it might be a total hack...See below!
# jobrunner.py
from multiprocessing import Process
import main
from main import BBOX
def _a(arg):
BBOX.append(arg) #This is the key
f = main.a()
print f.run()
def _b(arg):
BBOX.append(arg) #This is the key
p = main.b()
print p.run()
if __name__ == '__main__':
world = '-180,180,-90,90'
BBOX.append(world.split(','))
p1 = Process(target=_a, args=(BBOX[0],))
p2 = Process(target=_b, args=(BBOX[0],))
p1.start()
p2.start()
p1.join()
p2.join()
您不应期望在父进程中设置的全局变量的值会自动传播到子进程.
您的代码恰好在类似Unix的平台上工作,因为在那些平台上multiprocessing
使用 fork()
一个>.这意味着每个子进程都将获得父进程地址空间的副本,包括所有全局变量.
Your code happens to work on Unix-like platforms because on those platforms multiprocessing
uses fork()
. This means that every child processes gets a copy of the parent process's address space, including all global variables.
在Windows上不是这种情况;子进程需要从父进程访问的每个变量都必须明确地传递或放置在共享内存中.
This isn't the case on Windows; every variable from the parent process that needs to be accessed by the child has to be explicitly passed down or placed in shared memory.
执行此操作后,您的代码将在Unix和Windows上均可工作.
Once you do this, your code will work on both Unix and Windows.