值不存储在Pool()中的Manager()。dict()中

时间:2017-09-05 07:14:58

标签: python python-3.x python-multiprocessing pool multiprocessing-manager

这是主要代码:

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()定义:

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

如代码中所述,它是打印空列表而不是预期值。 如何使此共享字典和列表正常工作?

首次打印显示预期值。第二个打印显示预期的键,但值部分是空列表。由于它正确显示了密钥,因此共享正常。附加部分存在一些问题。我无法弄明白。

请假选民,在你认为我的问题与那个问题相同之前,请仔细阅读链接的问题。如果你仍然坚持他们是相同的,请发表评论说明你为什么这么认为。从我的观点来看,两个问题都不同。链接的问题询问如何与建议使用Manager.dict()的答案共享一个字典。我的问题已经使用了Manager.dict(),并且由于异常而失败。谢谢。

1 个答案:

答案 0 :(得分:0)

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

可以通过创建新词典并在变异后将mydict指向它来修复它。

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)