函数中的更改不会更改多处理中的对象

问题描述 投票:0回答:1

在函数一的下面代码中,我尝试将 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]
python multiprocessing multitasking
1个回答
0
投票

来自文档

如果标准(非代理)列表或字典对象包含在 referent,对那些可变值的修改不会被传播 通过管理器,因为代理无法知道什么时候 其中包含的值被修改。但是,将值存储在 容器代理(在代理对象上触发 setitem) 确实通过管理器传播,因此可以有效地修改此类 一个项目,可以将修改后的值重新分配给容器 代理:

当您创建托管列表

b1
b2
时,管理器仅跟踪对这些列表的更改。您可以将元素附加到列表、删除它们、分配它们。但是管理器不会跟踪列表的元素。如果您直接修改它们,则更改不会传播。

© www.soinside.com 2019 - 2024. All rights reserved.