当前位置: 首页 > 面试题库 >

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

艾志尚
2023-03-14
问题内容

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

进程_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,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()

问题答案:

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

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

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

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



 类似资料:
  • 本文向大家介绍成本差异和进度差异之间的差异,包括了成本差异和进度差异之间的差异的使用技巧和注意事项,需要的朋友参考一下 对于任何应用程序或专门用于任何项目,最关注的因素之一是在开发前和开发后阶段的预算管理和时间管理。因此,要评估任何项目的这两个主要因素,有很多方法,其中成本差异和进度差异是两个重要且主要的方法。 顾名思义,“成本差异”基于项目开发中花费的成本,而“进度差异”则基于相同开发中花费的时

  • 问题内容: 在阅读了这个答案和Robert Love的“LinuxKernelDevelopment”之后,随后在系统调用中,我发现Linux中的进程和线程(几乎)与内核没有区别。它们之间有一些调整(在引用的SO问题中被讨论为“更多共享”或“更少共享”),但是我仍然有一些问题需要解答。 我最近开发了一个包含几个POSIX线程的程序,并决定在此前提下进行试验。在创建两个线程的进程中,所有线程当然都会

  • 我是Stack Overflow的新手,也是编程的新手,所以希望这有意义。我正在编写一个java程序,在特定目录中创建一个文件。我的程序在Windows上运行并在正确的位置创建一个文件,但在Mac上不起作用。我尝试过将反斜杠更改为单个正斜杠,但不起作用。我应该如何更改代码以使其适用于Mac或理想情况下适用于两者?我在下面放了一些代码。 提前感谢! 为文件创建新路径的类: 获取用户输入文件放置位置的

  • 问题内容: 据我了解,python将输出输出,但显然并非总是如此。例如: 在ipython中: 在python中: ipython对输出应用什么转换? 问题答案: IPython使用代替方法或标准模块来打印输出。 模块提供了在后台使用的两个功能。 函数返回对象的字符串表示形式: 函数打印对象的表示形式: IPython使用其自己的漂亮打印机,因为标准Python模块“不允许开发人员提供自己的漂亮打

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 下载IntelliJ IDEA时,Linux有两个选项: 我假设Linux(.tar.gz)版本带有JDK,而Linux没有JDK(.tar.gz)版本则没有。然而,当阅读留档我看到: IntelliJ IDEA不包括SDK。因此,在开始编写代码之前,您必须下载并安装至少一个SDK,并在IntelliJ IDEA中定义它。 那么这两个版本之间到底有什么区别呢?如果一个附带JDK,它会附带哪个JDK