关于python:值不存储在Pool()中的Manager().dict()中

Value is not storing into Manager().dict() inside the Pool()

这是主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if __name__ == '__main__':
    manager = Manager()
    mylist = manager.list()
    mydict = manager.dict()

    mylist.append('abc')
    mylist.append('xyz')

    for k in mylist:
        mydict[k] = manager.list()

    pool = Pool(processes = 100)
    pool.map(func, arg)
    pool.terminate()

这是func()的定义:

1
2
3
4
5
6
7
for x in mylist:
    r = {}
    r['m'] = 1
    r['n'] = 2
    print (r) # gives correct values
    mydict[x].append(dict(r))
    print (mydict) # gives empty list, keys are printed correct

正如代码中的注释,它正在打印空列表,而不是预期值。如何使这个共享的dict和list正常工作?

第一次打印显示预期值。第二次打印显示预期的键,但值部分为空列表。因为它正确地显示了密钥,所以共享工作正常。附加部分有一些问题。我想不出来。

投反对票的人,在你认为我的问题和那个问题一样之前,请仔细阅读相关的问题。如果你仍然坚持他们是一样的,请留下评论,说明你为什么这么认为。从我的观点来看,这两个问题是不同的。链接问题询问如何与建议使用manager.dict()的答案共享dict。我的问题已经使用了manager.dict(),并且由于异常而失败。谢谢您。


从代码中的注释可以看出,mydictfunc()中被正确读取,但没有改变它。manger.dict()对象不能改变嵌套部分。

它可以通过创建一个新字典并在突变后将mydict指向它来修复。

1
2
3
4
5
6
7
8
9
for x in mylist:
    r = {}
    r['m'] = 1
    r['n'] = 2
    print (r)
    foo = mydict[x]
    foo.append(dict(r))
    mydict[x] = foo
    print (mydict)