9

我有一个名为 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()

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

亚当

更新:我想通了,即使它可能是一个完全的黑客......见下文!

# 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()
4

1 回答 1

22

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

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

Windows 上不是这种情况。父进程中需要被子进程访问的每个变量都必须显式向下传递或放置在共享内存中

一旦你这样做了,你的代码就可以在 Unix 和 Windows 上运行。

于 2011-07-06T12:54:47.353 回答