【发布时间】:2021-02-06 20:20:25
【问题描述】:
我有一个复杂的不可拾取对象,它具有复杂且不可拾取类型的属性(通过 getter 和 setter 定义)。我想为对象创建一个多处理代理以并行执行一些任务。
问题:虽然我已成功使 getter 方法可用于代理对象,但我未能使 getter 为不可选择的返回对象返回代理。
我的设置如下所示:
from multiprocessing.managers import BaseManager, NamespaceProxy
class A():
@property
def a(self):
return B()
@property
def b(self):
return 2
# unpickable class
class B():
def __init__(self, *args):
self.f = lambda: 1
class ProxyBase(NamespaceProxy):
_exposed_ = ('__getattribute__', '__setattr__', '__delattr__')
class AProxy(ProxyBase): pass
class BProxy(ProxyBase): pass
class MyManager(BaseManager):pass
MyManager.register('A', A, AProxy)
if __name__ == '__main__':
with MyManager() as manager:
myA = manager.A()
print(myA.b) # works great
print(myA.a) # raises error, because the object B is not pickable
我知道我可以在向管理器注册方法时指定方法的结果类型。也就是说,我可以做到
MyManager.register('A', A, AProxy, method_to_typeid={'__getattribute__':'B'})
MyManager.register('B', B, BProxy)
if __name__ == '__main__':
with MyManager() as manager:
myA = manager.A()
print(myA.a) # works great!
print(myA.b) # returns the same as myA.a ?!
我很清楚我的解决方案不起作用,因为__getattr__ 方法适用于所有属性,而我只希望它在访问属性a 时返回B 的代理。我怎样才能做到这一点?
作为一个附带问题:如果我从B 的__init__ 方法中删除*args 参数,我会收到一个错误,即使用错误数量的参数调用它。为什么?我该如何解决这个问题?
【问题讨论】:
标签: python proxy multiprocessing python-multiprocessing multiprocessing-manager