我有一个复杂的不可选取对象,它的属性(通过 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__返回代理。我怎样才能做到这一点?Ba
作为一个附带问题:如果我*args从 __init__的方法中删除参数B,我会收到一个错误,表明它被调用时参数数量错误。为什么?我该如何解决这个问题?
DIEA
相关分类