python class 变量不会在多处理中更新
python class variable won't updated in multiprocessing
我正在使用多处理来加快 python 中的一个长进程,我想将我的数据保存在一个单独的 class 中以使代码更清晰一些,但似乎我是否改变了class var 在进程中会回滚到进程之前的最后一个状态,而在 proceed 中则显示变量已更新。
这是简化的例子
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,正如我们在 return 值中看到的那样,但它不会在下一次迭代中从 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
您的代码有几处错误。 multiprocessing.Process()
的函数 运行 不共享父进程的地址 space。这就是为什么 persist_state
对象的操作没有反映在父进程中的原因。您可以以这种方式使用 multiprocessing.Lock()
对象是因为 class 被设计为在 multiprocessing.Process()
上下文中使用时以这种方式工作。这并不意味着您可以操纵任意对象的状态并将这些操纵反映在父进程中。
请参阅 Manager() class 的描述,了解解决此问题的一种方法。
我正在使用多处理来加快 python 中的一个长进程,我想将我的数据保存在一个单独的 class 中以使代码更清晰一些,但似乎我是否改变了class var 在进程中会回滚到进程之前的最后一个状态,而在 proceed 中则显示变量已更新。
这是简化的例子
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,正如我们在 return 值中看到的那样,但它不会在下一次迭代中从 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
您的代码有几处错误。 multiprocessing.Process()
的函数 运行 不共享父进程的地址 space。这就是为什么 persist_state
对象的操作没有反映在父进程中的原因。您可以以这种方式使用 multiprocessing.Lock()
对象是因为 class 被设计为在 multiprocessing.Process()
上下文中使用时以这种方式工作。这并不意味着您可以操纵任意对象的状态并将这些操纵反映在父进程中。
请参阅 Manager() class 的描述,了解解决此问题的一种方法。