如果我用 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 ?
答案 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)
它应该有用。