Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用多进程池时更新对象的成员变量_Python_Python 3.x_Python Multiprocessing - Fatal编程技术网

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中获取值,添加项目,然后将其分配回键。这很有效。