Python:获取进程中更改的对象的实际值

标签 python python-2.7 process

我正在尝试了解 multiprocessing 包中的 Process 类是如何工作的。 为此,我写了一个小例子,其中创建了一个具有特定值的对象,然后在子进程中更改该值:

from multiprocessing import Process

class Foo:
    def __init__(self):
        self.value = "foo"

    def run(self):
        p = Process(target=self.change_value)
        p.start()
        p.join()

    def change_value(self):
        self.value = "bar"
        print "inside: " + self.value


if __name__ == '__main__':
    foo = Foo()
    foo.run()
    print "outside: " + foo.value

但是这段代码给出了以下结果:

>> inside: bar
>> outside: foo

有人可以解释为什么它从进程外部打印旧属性值(“foo”),尽管第二次打印稍后执行吗? 以及如何从外部获取该属性(“bar”)的实际值?

最佳答案

这是因为 multiprocessing.Process 在新进程中生成了一个全新的、独立的 python 环境实例。您会注意到在任务管理器中,当您启动 Process 时,会出现一个新的 python.exe 进程。确实如此 - 如果您不使用 PipeQueue 等特殊对象 - 不会与启动它的进程共享内存。

关于已完成的内部工作的更多信息:

  • 您调用 p.start()。这将 pickle Process 对象 p 并生成一个具有自己的全局状态的 python 解释器的新实例,等等......它不与原始进程共享内存。相反,腌制的 p 在新流程中被取消腌制,工作在那里完成。
  • print "inside: "+ self.value:这是由新生成的进程调用的,因此所做的更改会反射(reflect)在这里
  • print "outside: "+ foo.value:这是在原始进程中调用的,它不知道派生进程的内存,也无法访问它。因此 foo 在这个过程中没有改变

我猜你打算用什么

您搜索的类很可能是 threading.Thread。它提供与 Process 相同的接口(interface),但它与启动它的 Thread 共享全局状态和 python 环境。生成的 Thread 中对象的任何更改都可以从外部读取。

关于Python:获取进程中更改的对象的实际值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898034/

相关文章:

xml - 如何在 Python 中以简单的方式拆分 XML 文件?

python-2.7 - python , Pandas : replacing values in one DF by same-index values from another DF

python - 到底是什么占用了这么多内存?

python - 在 python eve 应用程序中执行 PUT、PATCH 返回,请求的 URL 不允许该方法

c# - 为什么.exe 拒绝停止?

python - 如何使用 Python 从 txt 文件中删除最后 N 行?

python - 使用正则表达式设置变量

c - C 中使用 pipe()、execlp() 和 dup() 的三重管道

python - 在进程之间共享一个复杂的对象?

python - 是否可以在 init 构造函数之前先调用类的方法?