python类变量won';t在多处理中的更新
我正在使用多处理来加快python中的一个长进程,我想将数据保存在一个单独的类中,以便使代码更干净一些,但似乎无论我在进程中更改类var,它都会回滚到进程之前的最后一个状态,而在“继续”中,它显示变量已更新。python类变量won';t在多处理中的更新,python,class,multiprocessing,locking,Python,Class,Multiprocessing,Locking,我正在使用多处理来加快python中的一个长进程,我想将数据保存在一个单独的类中,以便使代码更干净一些,但似乎无论我在进程中更改类var,它都会回滚到进程之前的最后一个状态,而在“继续”中,它显示变量已更新。 下面是一个简化的例子 class state_mangment(): def __init__(self): print('__init__') self.last_save = -1 def update_state(self): self.last_
下面是一个简化的例子
class state_mangment():
def __init__(self):
print('__init__')
self.last_save = -1
def update_state(self):
self.last_save =self.last_save + 1
return self.last_save
from multiprocessing import Process, Lock
def f(l, i,persist_state ):
l.acquire()
try:
print('last save is ',persist_state.update_state(),' should be ',i)
finally:
l.release()
if __name__ == '__main__':
lock = Lock()
persist_state = state_mangment()
processes = []
for num in range(10):
p = Process(target=f, args=(lock, num,persist_state ))
processes.append(p)
p.start()
for p in processes:
p.join()
print(persist_state.last_save)
这是输出,正如您可以看到的,将变量从-1增加到0,正如我们在返回值中看到的,但在下一次迭代中它不会从0开始
__init__
last save is 0 should be 0
last save is 0 should be 1
last save is 0 should be 2
last save is 0 should be 3
last save is 0 should be 4
last save is 0 should be 5
last save is 0 should be 6
last save is 0 should be 7
last save is 0 should be 8
last save is 0 should be 9
-1
__初始化__
上次保存为0,应为0
上次保存为0,应为1
上次保存为0,应为2
最后一次保存是0,应该是3
最后一次保存是0,应该是4
最后一次保存是0,应该是5
最后一次保存是0,应该是6
最后一次保存是0,应该是7
最后一次保存是0,应该是8
最后一次保存是0,应该是9
-1
您的代码有几处错误。
multiprocessing.Process()
运行的函数不共享父进程的地址空间。这就是为什么父进程中没有反映对persist\u state
对象的操作。您可以以这种方式使用multiprocessing.Lock()
对象是因为该类被设计为在multiprocessing.Process()
上下文中使用时以这种方式工作。这并不意味着您可以操纵任意对象的状态,并在父进程中反映这些操纵
有关解决此问题的方法,请参见该类的说明。您应始终指定所有相关软件的版本;e、 例如,您正在使用的python版本。指定操作系统也总是一个好主意,即使它似乎并不相关。