我正在尝试使用multiprocessing的Pool.map()功能同时划分工作。当我使用以下代码时,它可以正常工作:
multiprocessing
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课:
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标准库方法进行注册。
copy_reg
例如,史蒂文·贝萨德(Steven Bethard)对这个线程的贡献(接近线程的结尾)显示了一种非常可行的方法,该方法允许通过进行酸洗/取消酸洗copy_reg。