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

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

Patricia Arquette
发布: 2024-12-12 22:05:14
原创
551 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板