multiprocessing模块状态的python文档:
在版本3.6中更改:共享对象可以嵌套例如,共享容器对象(如共享列表)可以包含其他共享对象,这些对象都将由SyncManager管理和同步。
这确实适用于listdict但是,如果我试图在共享的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代码知道何时跳过代理的引用增量(通过嵌套)。

09-25 18:03
查看更多