从另一个类

时间:2017-10-12 19:13:45

标签: python multiprocessing

我正在努力使用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管理器对象的引用。在我的实际实现中,我有一个中心对象,它基本上是一个巨大的数据管理器,然后是其他使用这些数据并以不同方式对其进行切片的对象。我想要的是能够共享超级数据集,但允许单个对象(在单独的线程中)通过单个管理器获取数据。

1 个答案:

答案 0 :(得分:1)

所以我找到的解决方法是为我想要暴露的每个属性实现get_函数,然后我编写了一个自定义register函数和AutoProxy方法,它们链接了具有适当get_函数的类。如果没有编写明确的get_函数就可以做到这一点真是太好了,但这似乎是最好的解决方法。