可以’t pickle when using python’的多处理Pool.map()

问题:

我正在尝试使用多处理器的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

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

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))

任何人都知道问题是什么,还是一个简单的方法呢?

回答:

问题是多进程必须腌制东西,以便在进程之间挂起它们,绑定的方法是不可挑剔的。解决方法(无论您认为“容易”还是不考虑;-)是将基础设施添加到程序中,以允许这种方法被腌制,使用copy_reg标准库方法进行注册。
例如,Steven Bethard对this thread(到线程结束)的贡献显示出一种完美可行的方法,允许通过copy_reg进行方法酸洗/取样

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Can’t pickle when using python’s multiprocessing Pool.map()

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

2 + = 10