加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows和Linux之间的Python Multiprocess差异

发布时间:2020-12-14 04:19:33 所属栏目:Windows 来源:网络整理
导读:我有一个名为jobrunner.py的脚本,它调用main.py中的类方法.见下文… # jobrunner.pyfrom multiprocessing import Processimport mainfrom main import BBOXdef _a(arg): f = main.a() print f.run()def _b(arg): p = main.b() print p.run()if __name__ == '
我有一个名为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上运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读