查看源代码后,对其进行一些修改即可让我毫无问题地获得 defaultdict 类型代理(基于内置 DictProxy 的创建方式)。
from collections import defaultdict
from multiprocessing.managers import MakeProxyType, SyncManager
DefaultDictProxy = MakeProxyType("DefaultDictProxy", [
'__contains__', '__delitem__', '__getitem__', '__len__',
'__setitem__', 'clear', 'copy', 'default_factory', 'fromkeys',
'get', 'items', 'keys', 'pop', 'popitem', 'setdefault',
'update', 'values'])
SyncManager.register("defaultdict", defaultdict, DefaultDictProxy)
# Can also create your own Manager here, just using built in for simplicity
if __name__ == '__main__':
with SyncManager() as sm:
dd = sm.defaultdict(list)
print(dd['a'])
# []
就我个人而言,我发现通过使用已经提供的工具很方便,甚至不需要担心如何自己对其进行子类化。
但是,我认为这不会允许您创建您正在寻找的默认锁定方案。多处理锁被设计为仅继承,并且通常锁不能被腌制,这是通过代理传输的数据类型的要求。例子:
from multiprocessing import Lock
m = SyncManager()
m.start()
d = m.defaultdict(Lock)
print(d['named_lock'])
m.shutdown()
会引发运行时错误:
RuntimeError: Lock objects should only be shared between processes through inheritance