python - 使用多处理 Pool.map() 时无法 pickle

我正在尝试使用 multiprocessingPool.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

当以下是我的主程序时会发生这种情况:

import someClass

if __name__== '__main__' :
    sc = someClass.someClass()
    sc.go()

以下是我的 someClass 类:

import multiprocessing

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 东西以将它们吊在进程之间,并且绑定(bind)的方法是不可 pickle 的。解决方法(无论您是否认为它“容易”;-) 是将基础结构添加到您的程序中以允许对此类方法进行 pickle ,并将其注册到 copy_reg标准库方法。

例如,Steven Bethard 对 this thread 的贡献(接近线程的末尾)展示了一种完全可行的方法来允许通过 copy_reg 进行方法 pickle/取消 pickle 。

关于python - 使用多处理 Pool.map() 时无法 pickle <type 'instancemethod' >,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1816958/

相关文章:

linux - 在一行中执行组合多个 Linux 命令

linux - 如何在 Linux 上按名称而不是 PID 杀死进程?

python - 在 Python 中使用多处理时我应该如何记录?

linux - 如何在 Linux 上通过 FTP 递归下载文件夹

python - 如何在 Python 中生成动态(参数化)单元测试?

linux - 如何使用 YUM 列出包的内容?

python - 如何在给定的图上绘制垂直线

linux - 如何限制递归文件列表的深度?

linux - 如何从 Linux shell 运行具有与当前不同工作目录的程序?

python - 如何在 Django 中按日期范围过滤查询对象?