不能泡菜<键入“instancemethod”>使用多处理池时。map()

我正在尝试使用多处理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对方法进行酸洗/取消酸洗

发表评论