Python:在Process中获取对象的实际值

时间:2015-10-01 22:50:33

标签: python python-2.7 process

我试图了解多处理包中的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")?

1 个答案:

答案 0 :(得分:1)

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

关于内部工作的更多内容:

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

我猜您打算使用

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