首页 >后端开发 >Python教程 >为什么多重处理会失败并显示'Can't Pickle InstanceMethod”以及如何修复它?

为什么多重处理会失败并显示'Can't Pickle InstanceMethod”以及如何修复它?

Patricia Arquette
Patricia Arquette原创
2024-12-12 22:05:14553浏览

Why Does Multiprocessing Fail with

多处理中的错误处理:“无法 Pickle InstanceMethod”

在多处理中,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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn