我正在尝试使用多处理的Pool.map()函数同时划分工作。当我使用以下代码时,它工作正常:
导入多处理
def f(x):
返回x*x
def go():
池=多处理。池(进程=4)
打印池地图(f,范围(10))
如果uuuu name uuuuuu=’\uuuuuuu main\uuuuuuu’:
go()
然而,当我在更面向对象的方法中使用它时,它不起作用。它给出的错误消息是:
PicklingError:无法pickle<;键入“instancemethod”>;:属性查找
__内置实例方法失败
当以下是我的主程序时会发生这种情况:
导入someClass
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
sc=someClass.someClass()
sc.go()
下面是我的someClass课程:
导入多处理
类someClass(对象):
定义初始化(自):
通过
def f(自身,x):
返回x*x
def go(自我):
池=多处理。池(进程=4)
打印池映射(self.f,范围(10))
有人知道问题可能是什么,或者是一个简单的解决方法吗
问题是,多处理必须对对象进行pickle处理,以便在进程之间吊起它们,而绑定方法是不可拾取的。解决方法(不管你认为它是否简单),是将基础设施添加到程序中,以允许这种方法被腌制,用CopythReg标准库方法注册。
例如,Steven Bethard对此线程的贡献(在线程末尾)显示了一种非常可行的方法,允许通过copy\u reg对方法进行酸洗/取消酸洗