微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Windows和Linux之间的Python多进程差异

如何解决Windows和Linux之间的Python多进程差异

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

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

完成此操作后,您的代码将在Unix和Windows上均可使用。

解决方法

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

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

亚当

更新: 我想出了即使它可能是一个完全hack …见下文!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。