gpt4 book ai didi

python - 关于带有字典键的多处理管理器的混淆

转载 作者:行者123 更新时间:2023-11-28 21:38:24 25 4
gpt4 key购买 nike

谁能解释为什么下面的代码会产生键错误?多处理器 namespace 管理器是否存在字典问题?

import multiprocessing

def f(string, namespace):
namespace.results_dict[string] = string

if __name__ == '__main__':
mgr = multiprocessing.Manager()
ns = mgr.Namespace()
ns.results_dict = {}
p = multiprocessing.Process(target=f, args=('burger', ns,))

p.start()
p.join()

print(ns.results_dict)

最佳答案

如果在更新操作后添加打印,您会看到更新没有任何效果:

def f(string, namespace):
namespace.results_dict[string] = string
print(namespace)

打印:

Namespace(results_dict={})

这是因为每次访问 namespace.results_dict 时,它的值(空字典)都是从托管命名空间中检索的。该字典的状态不受管理,只能直接访问命名空间。为了使您的示例工作,您必须使用更改后的字典显式更新命名空间,例如:

def f(string, namespace):
r = namespace.results_dict # retrieves copy
r[string] = string # modify local copy
namespace.results_dict = r # write it back

您也可以将托管字典用作原始函数的 results_dict:

if __name__ == '__main__':
mgr = multiprocessing.Manager()
ns = mgr.Namespace()
ns.results_dict = mgr.dict()
p = multiprocessing.Process(target=f, args=('burger', ns,))

p.start()
p.join()

print(ns.results_dict)

现在对该字典的更改将立即可见,但对命名空间中其他可变数据结构的更改仍将仅在写访问时更新。

关于python - 关于带有字典键的多处理管理器的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48337622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com