python 对象组合和多处理

标签 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

最佳答案

问题是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)

它应该可以工作。

关于python 对象组合和多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47164697/

相关文章:

python - 重新分配 Pandas df 中的列值

python - 在列表中操作列表的优雅方法?

python - python中的多线程系统调用

java - 局部引用变量也称为组合吗?

python3 计划 : schedule events after run()

python - 用于 AES 256 加密的(纯)Python 库是什么?

python - 在 python 中使用多处理时无法使用所有处理器

python - 从python多进程返回变量

c++ - 访问组合类c++的成员

javascript - 通过函数添加原型(prototype)函数来组合 JS 对象