Python: 获取进程中更改的对象的实际值
Python: Getting actual value of object changed in Process
我正在尝试了解 multiprocessing 包中的 Process class 是如何工作的。
为此,我写了一个小例子,其中创建了一个具有特定值的对象,然后在子进程中更改了该值:
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
进程。它确实 - 如果你不使用特殊对象,如 Pipe
和 Queue
- 不与启动它的进程共享内存。
关于已完成的内部工作的更多信息:
- 你打电话给
p.start()
。这将 pickle
Process
对象 p 并生成具有自己的全局状态的 python 解释器的新实例,等等......它不与原始进程共享内存。相反,腌制的 p
在新流程中被取消腌制,工作在那里完成。
print "inside: " + self.value
:这是由新生成的进程调用的,因此所做的更改会反映在此处
print "outside: " + foo.value
:这是在原始进程中调用的,它不知道派生进程的内存并且无法访问它。因此 foo
在过程中没有改变
我猜你打算使用什么
您搜索的 class 很可能是 threading.Thread
。它提供与 Process
相同的界面,但它共享全局状态和 python 环境,并与 Thread
启动。生成的 Thread
中对象的任何更改都可以从外部读取。
我正在尝试了解 multiprocessing 包中的 Process class 是如何工作的。 为此,我写了一个小例子,其中创建了一个具有特定值的对象,然后在子进程中更改了该值:
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
进程。它确实 - 如果你不使用特殊对象,如 Pipe
和 Queue
- 不与启动它的进程共享内存。
关于已完成的内部工作的更多信息:
- 你打电话给
p.start()
。这将pickle
Process
对象 p 并生成具有自己的全局状态的 python 解释器的新实例,等等......它不与原始进程共享内存。相反,腌制的p
在新流程中被取消腌制,工作在那里完成。 print "inside: " + self.value
:这是由新生成的进程调用的,因此所做的更改会反映在此处print "outside: " + foo.value
:这是在原始进程中调用的,它不知道派生进程的内存并且无法访问它。因此foo
在过程中没有改变
我猜你打算使用什么
您搜索的 class 很可能是 threading.Thread
。它提供与 Process
相同的界面,但它共享全局状态和 python 环境,并与 Thread
启动。生成的 Thread
中对象的任何更改都可以从外部读取。