Windows和Linux之间的Python Multiprocess差异

aeu*_*ere 6 python multiprocessing globals

我有一个名为jobrunner.py的脚本,它调用main.py中的类方法.见下文...

# 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()
Run Code Online (Sandbox Code Playgroud)

在OSX和Ubuntu上调用进程_a和_b没有任何问题,但是当我尝试在Windows上运行相同的东西(相同版本的python和all)时,它无法说索引超出范围.这让我相信在Windows平台上的模块之间没有设置或传递"全局"变量BBOX.有没有其他人看到这样的东西,知道如​​何解决它?

亚当

更新:虽然它可能是一个彻底的黑客,但我想出来了......见下文!

# 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()
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 18

您不应期望在父进程中设置的全局变量的值会自动传播到子进程.

您的代码恰好在类Unix平台上运行,因为在这些平台上multiprocessing使用fork().这意味着每个子进程都获取父进程的地址空间的副本,包括所有全局变量.

在Windows上不是这种情况; 需要由子进程访问的父进程中的每个变量都必须明确传递或放在共享内存中.

完成此操作后,您的代码将在Unix和Windows上运行.