python对象组合和多处理

时间:2017-11-07 18:07:53

标签: python python-multiprocessing object-composition

如果我用 getattr 实现对象组合并将对象传递给一个新进程,我会从 getattr 中得到一个RecursionError。这是一个例子:

from multiprocessing import Pool

class Bar:
    def __init__(self, bar):
        self.bar = bar

class Foo:
    def __init__(self, bar):
        self._bar = bar

    def __getattr__(self, attr):
        try:
            return getattr(self._bar, attr)
        except RecursionError:
            print('RecursionError while trying to access {}'.format(attr))
            raise AttributeError

def f(foo):
    print(foo.bar)

if __name__ == '__main__':
    foo = Foo(Bar('baz'))
    f(foo)
    p = Pool(1)
    p.map(f, [foo])

输出是这样的:

baz
RecursionError while trying to access _bar
baz

为什么Foo没有找到_bar属性而必须诉诸 getattr

1 个答案:

答案 0 :(得分:2)

问题是Python需要序列化foo对象并在新进程中重新生成它。在复活过程中不会调用__init__,因此您的foo对象很早就没有._bar属性。

解决方案是让序列化/复活方法特别通过,即。将您的__getattr__更改为:

def __getattr__(self, attr):
    if attr in {'__getstate__', '__setstate__'}:
        return object.__getattr__(self, attr)
    return getattr(self._bar, attr)

它应该有用。