python类变量不会在多处理中更新

这是怎么回事

我正在使用多重处理来加快python中的长过程,我想将数据保存在一个单独的类中,以使代码更简洁一些,但是看来,如果我在过程中更改类var,它将回滚到最后一个状态在执行此过程之前,它表明变量已更新。
这是简化的例子

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__
最后一次保存为0应该为0
最后一次保存为0应该为1
最后一次保存为0应该为2
最后一次保存为0应该为3
最后一次保存为0应该为4
最后一次保存为0应该为5
最后一次保存为0应该为6
最后保存为0应为7
最后保存为0应为8
最后保存为0应为9 
-1
    
柯蒂斯·雷德(Kurtis Rader)

您的代码有几处错误。运行的multiprocessing.Process()函数不共享父进程的地址空间。这就是为什么persist_state对象的操作未反映在父进程中的原因。可以multiprocessing.Lock()以这种方式使用对象是因为该类被设计为在multiprocessing.Process()上下文中以这种方式工作这并不意味着您可以操纵任意对象的状态并使那些操纵反映在父进程中。

有关解决此问题的一种方法,请参见Manager()类的描述

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章