Python 使用多进程池时更新对象的成员变量
我有一个类Python 使用多进程池时更新对象的成员变量,python,python-3.x,python-multiprocessing,Python,Python 3.x,Python Multiprocessing,我有一个类B,它由另一个类a组成 在类B中,我使用多处理池从类a调用一个方法。此方法更新a(dict)的成员变量 当我打印出这个成员变量时,它似乎没有被更新。以下是描述问题的代码: 将多处理导入为mp 类别A(): 定义初始化(自): self.aDict={'key':0} def设置锁定(自锁定): self.lock=lock def do_工作(自身、项目): 打印(“正在为项目{}工作”。格式(项目)) self.aDict['key']+=1 返回[1,2,3]#返回一些列表 B类(
B
,它由另一个类a
组成
在类B
中,我使用多处理池从类a
调用一个方法。此方法更新a
(dict)的成员变量
当我打印出这个成员变量时,它似乎没有被更新。以下是描述问题的代码:
将多处理导入为mp
类别A():
定义初始化(自):
self.aDict={'key':0}
def设置锁定(自锁定):
self.lock=lock
def do_工作(自身、项目):
打印(“正在为项目{}工作”。格式(项目))
self.aDict['key']+=1
返回[1,2,3]#返回一些列表
B类():
定义初始化(自):
self.objA=A()
def run_与_mp(自身)一起运行:
items=['item1','item2']
使用mp.Pool(processs=mp.cpu\u count())作为池:
结果=pool.map\u异步(self.objA.do\u工作,项)
result.wait()
pool.terminate()
打印(self.objA.aDict)
def运行(自):
items=['item1','item2']
对于项目中的项目:
自组织工作(项目)
打印(self.objA.aDict)
如果名称=“\uuuuu main\uuuuuuuu”:
b=b()
b、 使用_mp()运行#打印{'key':0}
b、 run()#打印{'key':2}
b.run\u with\u mp()
打印{'key':0}
整个b.run()
打印{'key':2}
。我认为多处理池版本也会这样做,因为对象self.objA
可以运行多处理池所在的B
的完整类
我认为池中的每个工作人员都会看到不同版本的
self.objA
,这与主程序流中的版本不同。有没有办法让所有工作人员更新一个公共变量 你已经接近解释了,事实上,每个衍生的进程都有自己的内存区域,这意味着它们是独立的。运行do_work
时,每个进程都会更新其aDict
版本,因为该变量未共享。如果要共享变量,最简单的方法是使用管理器
,例如:
将多处理导入为mp
类别A():
定义初始化(自):
self.aDict=mp.Manager().dict({'key':0})
def设置锁定(自锁定):
self.lock=lock
def do_工作(自身、项目):
打印(“正在为项目{}工作”。格式(项目))
self.aDict['key']+=1
返回[1,2,3]#返回一些列表
B类():
定义初始化(自):
self.objA=A()
def run_与_mp(自身)一起运行:
items=['item1','item2']
使用mp.Pool(processs=mp.cpu\u count())作为池:
结果=pool.map\u异步(self.objA.do\u工作,项)
result.wait()
pool.terminate()
打印(self.objA.aDict)
def运行(自):
items=['item1','item2']
对于项目中的项目:
自组织工作(项目)
打印(self.objA.aDict)
如果名称=“\uuuuu main\uuuuuuuu”:
b=b()
b、 使用_mp()运行#打印{'key':2}
b、 run()#打印{'key':4}
我修改了您的示例以共享
aDict
变量,因此每个进程都将更新该属性(run\u with\u mp
和run
方法)。考虑阅读更多.谢谢,它在我使用MP(Mault.Maulor())中的Dead()时起作用,如果我使用一个简单的字典。当我在dict中使用其他对象作为键的值时,例如self.aDict=mp.Manager().dict({'key':set()})
和do_work()
,我使用self.aDictt['key'].add(item)
它似乎不起作用。set()始终为空。是这样吗?@Bharat是的,这是一个已知的问题,这是一个非常重要的问题。基本上,尝试共享简单的对象。谢谢,我使用了在回答这个问题时描述的方法,从dict中获取值,添加项目,然后将其分配回键。这很有效。