我正在努力使用Python Multiprocessing Manager对象......我正在进行这种结构:
from multiprocessing.managers import BaseManager, NamespaceProxy
from multiprocessing import RLock
class Foo(object):
def __init__(self, a):
self._a = a
self._lock_a = RLock()
@property
def a(self):
return self._a
def update_a(self, new_value):
with self._lock_a:
self._a = new_value
def get_bar(self):
return Bar(self)
class FooManager(BaseManager): pass
class FooProxy(NamespaceProxy):
_exposed_ = ('__getattribute__', '__setattr__', '__delattr__', 'a')
FooManager.register("Foo", Foo, FooProxy)
class Bar(object):
def __init__(self, foo):
self._foo = foo
@property
def a(self):
return self._foo.a
def update_a(self, value):
self._foo.update_a(value)
if __name__ == "__main__":
fmgr = FooManager()
fmgr.start()
foo = fmgr.Foo(5)
bar = Bar(foo)
print(bar.a)
bar.update_a(10)
print(bar.a)
它运行第一种方法就好了并打印出5.然而,当我去更新值时我得到了这个错误:
RuntimeError:RLock对象只能通过继承在进程之间共享
现在我使用经理的原因是这样的,这样的调用,以及可能来自其他流程的调用将会出现#30;漏斗"到同一个对象。看起来它似乎试图在这里复制/共享托管对象。有人可以告诉我是否有可能做我在这里尝试的事情,如果可以的话怎么做?或者我对经理的工作有错误的想法?
我真正想要的是Bar
个对象只保存对单个foo
管理器对象的引用。在我的实际实现中,我有一个中心对象,它基本上是一个巨大的数据管理器,然后是其他使用这些数据并以不同方式对其进行切片的对象。我想要的是能够共享超级数据集,但允许单个对象(在单独的线程中)通过单个管理器获取数据。
答案 0 :(得分:1)
所以我找到的解决方法是为我想要暴露的每个属性实现get_
函数,然后我编写了一个自定义register
函数和AutoProxy
方法,它们链接了具有适当get_
函数的类。如果没有编写明确的get_
函数就可以做到这一点真是太好了,但这似乎是最好的解决方法。