python类变量won';t在多处理中的更新

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_

我正在使用多处理来加快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__ 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版本。指定操作系统也总是一个好主意,即使它似乎并不相关。