在函数一的下面代码中,我尝试将 1 与 len(test.a) 相加并将其附加到 test.a 它实际上发生了,但是当程序退出该函数时,测试返回到之前的状态 我期望的是当我打印(a1.a)时我想得到 [1,2,3] 但我得到 [1,2]
导入多处理
class abc():
def __init__(self):
self.a=[1,2]
self.b=[1,2,3]
def one(test):
a=len(test.a)+1
test.a.append(a)
print('test.a==',test.a)
return test
if __name__ == '__main__':
with multiprocessing.Manager() as manager:
a1=abc()
a2=abc()
b1 = manager.list([a1])
b2 = manager.list([a2])
# print('type(a1)==', type(a1[0]))
p1 = multiprocessing.Process(target=one, args=[b1[0]])
p2 = multiprocessing.Process(target=one, args=[b2[0]])
p1.start()
p2.start()
p1.join()
p2.join()
print(a1.a)
output is:
test.a== [1, 2, 3]
test.a== [1, 2, 3]
[1, 2]
来自文档:
如果标准(非代理)列表或字典对象包含在 referent,对那些可变值的修改不会被传播 通过管理器,因为代理无法知道什么时候 其中包含的值被修改。但是,将值存储在 容器代理(在代理对象上触发 setitem) 确实通过管理器传播,因此可以有效地修改此类 一个项目,可以将修改后的值重新分配给容器 代理:
当您创建托管列表
b1
和b2
时,管理器仅跟踪对这些列表的更改。您可以将元素附加到列表、删除它们、分配它们。但是管理器不会跟踪列表的元素。如果您直接修改它们,则更改不会传播。