我正在运行以下代码
from multiprocessing import Process
from multiprocessing import Value
class TestMultiprocess(Process):
def __init__(self):
super().__init__()
self.variable={"value":"initial"}
def run(self):
print("executing the run function")
self.variable={"value":"new"}
t=TestMultiprocess()
t.start()
t.join()
print(t.variable) #prints {"value":"initial"}, (I expected {"value":"new"})
我正在run函数中设置变量的值,但这个值没有反映在对象中(它仍然保存在构造函数中初始化的值(。为什么会这样??
如何在继承多处理的类的run函数中设置/更改属性值,并使用创建类对象的客户端代码中的值。我查看了multiprocessing.values,但它不支持字典。我需要设置的属性值是字典
您的进程正在不同的地址空间中运行。因此,您的TestMultiProcess
实例必须被序列化并发送到该子进程的地址空间,然后在那里进行反序列化(所有这些都是用pickle
模块完成的(。因此,正在更新的是子进程地址空间中的实例副本;主进程的实例永远不会更新。
最简单的解决方案是使用托管字典。真正的字典";生命;以下代码中Manager
和变量managed_dict
的地址空间实际上是一个代理对象,因此当调用其方法之一时,方法名称及其自变量将发送到Manager
进程,在该进程中更新实际字典:
from multiprocessing import Process, Manager
class TestMultiprocess(Process):
def __init__(self, managed_dict):
super().__init__()
self.managed_dict = managed_dict
self.managed_dict["value"] = "initial"
def run(self):
print("executing the run function")
self.managed_dict["value"] = "new"
# Required for Windows:
if __name__ == '__main__':
with Manager() as manager:
managed_dict = manager.dict()
t = TestMultiprocess(managed_dict)
print(t.managed_dict)
t.start()
t.join()
print(t.managed_dict)
打印:
{'value': 'initial'}
executing the run function
{'value': 'new'}