Windows和Linux之间的Python Multiprocess差异

前端之家收集整理的这篇文章主要介绍了Windows和Linux之间的Python Multiprocess差异前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个名为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,))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

在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,args=(BBox[0],))

    p1.start()
    p2.start()

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

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

在Windows上不是这种情况;来自父进程的每个需要由子进程访问的变量必须明确为passed down or placed in shared memory.

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

猜你在找的Windows相关文章