专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Perl/Python

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

发布时间:2011-06-29 20:10:19 文章来源:www.iduyao.cn 采编人员:星星草
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
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: