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

2024-09-30 14:31:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用多进程来加快python中的一个长进程,我想将数据保存在一个单独的类中,以便使代码更干净一点,但似乎无论我在进程中更改类var,它都会回滚到进程之前的最后一个状态,而在procedue中,它显示变量已更新。
下面是一个简化的例子

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
    

Tags: self进程initissavedefupdatebe
1条回答
网友
1楼 · 发布于 2024-09-30 14:31:47

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

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

相关问题 更多 >