multiprocessing
模块状态的python文档:
在版本3.6中更改:共享对象可以嵌套例如,共享容器对象(如共享列表)可以包含其他共享对象,这些对象都将由SyncManager
管理和同步。
这确实适用于list
和dict
但是,如果我试图在共享的Queue
中创建共享的dict
,则会得到一个错误:
>>> from multiprocessing import Manager
>>> m = Manager()
>>> d = m.dict()
>>> d['a'] = m.list()
>>> d['b'] = m.dict()
>>> d['c'] = m.Queue()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 2, in __setitem__
File "/usr/lib/python3.6/multiprocessing/managers.py", line 772, in _callmethod
raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError:
---------------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.6/multiprocessing/managers.py", line 228, in serve_client
request = recv()
File "/usr/lib/python3.6/multiprocessing/connection.py", line 251, in recv
return _ForkingPickler.loads(buf.getbuffer())
File "/usr/lib/python3.6/multiprocessing/managers.py", line 881, in RebuildProxy
return func(token, serializer, incref=incref, **kwds)
TypeError: AutoProxy() got an unexpected keyword argument 'manager_owned'
---------------------------------------------------------------------------
似乎https://hg.python.org/cpython/rev/39e7307f9aee是引入嵌套共享对象的变更集。
最佳答案
该错误是由当前未处理所有AutoProxy
参数引起的。有一个pull request尚未合并。您要么需要修改补丁BaseProxy
,要么查看AutoProxy
并将补丁here中的更改直接应用到源代码中。
修复修补程序中的两行代码以防止服务器进程中出现内存泄漏,这一点非常重要。multiprocessing.managers.py
-标志用于让manager_owned
代码知道何时跳过代理的引用增量(通过嵌套)。