在多处理中,Pool.map() 函数在进程之间划分任务以并发执行。但是,在使用绑定方法时,您可能会遇到错误,如给定代码所示:
import multiprocessing def f(x): return x*x def go(): pool = multiprocessing.Pool(processes=4) print pool.map(f, range(10)) if __name__== '__main__' : go()
此代码可以无缝运行。但是,使用更面向对象的方法可能会失败并出现错误:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
当您尝试将 Pool.map() 与绑定方法一起使用时,会出现此错误,如以下代码所示:
import someClass if __name__== '__main__' : sc = someClass.someClass() sc.go() class someClass(object): def __init__(self): pass def f(self, x): return x*x def go(self): pool = multiprocessing.Pool(processes=4) print pool.map(self.f, range(10))
解决方案:
问题源于多处理的要求pickle 对象以在进程之间分发它们。然而,绑定方法本质上并不是可腌制的。解决方案包括创建必要的基础设施来启用酸洗。
一种方法是使用 copy_reg 标准库方法来注册酸洗和取消酸洗函数。例如,Steven Bethard 对相关讨论线程的贡献提供了一种使用 copy_reg 进行方法 pickling 和 unpickling 的可行方法。
以上是为什么多重处理会失败并显示'Can't Pickle InstanceMethod”以及如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!