Python对run函数中未反映在对象中的值集进行多处理



我正在运行以下代码

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'}

相关内容

  • 没有找到相关文章

最新更新