Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多线程:管理器dict不可序列化_Python_Json_Serialization_Dictionary_Multiprocessing - Fatal编程技术网

Python多线程:管理器dict不可序列化

Python多线程:管理器dict不可序列化,python,json,serialization,dictionary,multiprocessing,Python,Json,Serialization,Dictionary,Multiprocessing,我设法在python脚本中加入了多线程。我使用多处理模块的管理器在多个线程上创建和共享一个词汇 在我的脚本结束时,我想将dict作为json输出到一个文件中,因此我会: output = open(args.file,'w') output.write(json.dumps(data)) 但我犯了一个错误,说manager dict不可序列化: TypeError: <DictProxy object, typeid 'dict' at 0x2364210> is not JSON

我设法在python脚本中加入了多线程。我使用多处理模块的管理器在多个线程上创建和共享一个词汇

在我的脚本结束时,我想将dict作为json输出到一个文件中,因此我会:

output = open(args.file,'w')
output.write(json.dumps(data))
但我犯了一个错误,说manager dict不可序列化:

TypeError: <DictProxy object, typeid 'dict' at 0x2364210> is not JSON serializable
TypeError:不可序列化JSON
把我的口述连载起来的聪明方法是什么?我必须将键值复制粘贴到另一个-常规-键值吗?

。。。“相当”简单

我看到了一个问题

我必须在dictionnary的键上使用iter()来创建一个可以序列化的新“常用”值。

如果dict值都可以序列化 它看起来就像通过
dict
构造函数传递
DictProxy
就可以将数据序列化为JSON。下面的示例来自Python 3.6:

>>> import multiprocessing, json
>>> m = multiprocessing.Manager()
>>> d = m.dict()
>>> d["foo"] = "bar"
>>> d
<DictProxy object, typeid 'dict' at 0x2a4d630>
>>> dict(d)
{'foo': 'bar'}
>>> json.dumps(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  ...
TypeError: Object of type 'DictProxy' is not JSON serializable
>>> json.dumps(dict(d))
'{"foo": "bar"}'
解决方案是扩展
json.jsonecoder
类来处理
DictProxy
对象,如下所示:

>>> import multiprocessing, json
>>> class JSONEncoderWithDictProxy(json.JSONEncoder):
...     def default(self, o):
...             if isinstance(o, multiprocessing.managers.DictProxy):
...                     return dict(o)
...             return json.JSONEncoder.default(self, o)
...
>>> m = multiprocessing.Manager()
>>> d = m.dict()
>>> d["foo"] = m.dict()
>>> d["foo"]["bar"] = "baz"
>>> json.dumps(d, cls=JSONEncoderWithDictProxy)
'{"foo": {"bar": "baz"}}'
>>> # This also works:
>>> JSONEncoderWithDictProxy().encode(d)
'{"foo": {"bar": "baz"}}'
当JSON编码器遇到
DictProxy
时,它会将其转换为
dict
,然后对其进行编码。有关更多信息,请参阅

>>> import multiprocessing, json
>>> class JSONEncoderWithDictProxy(json.JSONEncoder):
...     def default(self, o):
...             if isinstance(o, multiprocessing.managers.DictProxy):
...                     return dict(o)
...             return json.JSONEncoder.default(self, o)
...
>>> m = multiprocessing.Manager()
>>> d = m.dict()
>>> d["foo"] = m.dict()
>>> d["foo"]["bar"] = "baz"
>>> json.dumps(d, cls=JSONEncoderWithDictProxy)
'{"foo": {"bar": "baz"}}'
>>> # This also works:
>>> JSONEncoderWithDictProxy().encode(d)
'{"foo": {"bar": "baz"}}'