首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

python 关于multiprocessing中在Namespace的实例下保存dict/list的疑问解决方法

2012-02-03 
python 关于multiprocessing中在Namespace的实例下保存dict/list的疑问想在多进程中保存一个shared dict,

python 关于multiprocessing中在Namespace的实例下保存dict/list的疑问
想在多进程中保存一个shared dict,想把这个dict放在了Namespace()实例下,结果发现对其的赋值无效(对list类型的也无效),想不明白是什么原因,是Namespace/NamespaceProxy不支持这种通过实例方法赋值的方式么?希望明白的给讲下是怎么回事,或者有什么办法能实现?谢谢!

原脚本太长,因此通过python shell来show我的疑问所在:

Python code
>>> from multiprocessing.managers import SyncManager>>> mm=SyncManager()>>> mm.start()>>> nms=mm.Namespace()>>> str(nms)'Namespace()'>>> nms.nr=0 # 简单的变量没有问题>>> str(nms)'Namespace(nr=0)'>>> nms.nr=55 # 无问题>>> str(nms)'Namespace(nr=55)'>>> nms.d=mm.dict()  # shared dict>>> nms.d{}>>> str(nms)'Namespace(d={}, nr=55)'>>> nms.d['testkey']=78  # 就是这里,赋值无效,但也不出错>>> str(nms)'Namespace(d={}, nr=55)'>>> d=mm.dict()  # 不放在Namespace实例下则正常>>> d['testkey']=89 # 赋值正常>>> d['testkey']89>>> nms.d=mm.dict(thekey=45)  # 用一个kv初始化>>> str(nms)"Namespace(d={'thekey': 45}, nr=55)">>> nms.d['shit']=66   # 赋值依然无效,也不出错>>> str(nms)"Namespace(d={'thekey': 45}, nr=55)">>> 


[解决办法]
这种重要的行为一般文档里都会写得很清楚。
16.6. multiprocessing — Process-based “threading” interface
16.6.2.7. Managers
Note Modifications to mutable values or items in dict and list proxies will not be propagated through the manager, because the proxy has no way of knowing when its values or items are modified. To modify such an item, you can re-assign the modified object to the container proxy:

[解决办法]
探讨
nms.d['testkey']=78

热点排行