+ -
当前位置:首页 → 问答吧 → python 关于multiprocessing中在Namespace的实例下保存dict/list的疑问

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

时间:2011-12-14

来源:互联网

想在多进程中保存一个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)"
>>> 

作者: livelivelive   发布时间: 2011-12-14

貌似Namespace支持基本类型,SyncManager里有list(),dict()方法应该可以满足你的需求.刚才查看了一下API

Namespace()
Create a shared Namespace object and return a proxy for it

dict() 
Create a shared dict object and return a proxy for it.

list() 
Create a shared list object and return a proxy for 


作者: userguanguan   发布时间: 2011-12-14