python multiprocessing 无法pickle

9 浏览
0 Comments

python multiprocessing 无法pickle

尝试运行上述代码时出现错误,错误信息为:cPickle.PicklingError: Can't pickle : attribute

lookup builtin.instancemethod failed。请问你能给出解决方案吗?

0
0 Comments

在上述代码中,使用了Python的multiprocessing模块来实现多进程并行处理。在代码中定义了一个类A,其中包含一个方法run和一个方法test。在方法run中,使用multiprocessing.Pool创建了一个进程池,并使用apply_async方法异步地调用了方法proxy。方法proxy接受两个参数:一个是类A的实例self,一个是参数args。在方法proxy内部,调用了实例的方法test,并将参数args传递给它。最后,通过调用get方法获取到异步任务的返回值,并打印出来。

然而,运行上述代码时会出现一个错误:multiprocessing Can't pickle 。这个错误的原因是,multiprocessing模块在进行进程间通信时需要将数据序列化,而实例方法无法直接序列化。

为了解决这个问题,可以将方法test定义为一个静态方法(使用@staticmethod装饰器),或者将方法定义在类A的外部。这样做的原因是,静态方法和函数可以被序列化,而实例方法无法被序列化。

下面是修改后的代码:

# coding: utf-8
import multiprocessing
def proxy(cls_instance, args):
    return A.test(args)
class A(object):
    def __init__(self):
        pass
    def run(self):
        sheets = ['a', 'b', 'c', 'd', 'e']
        result = []
        pool = multiprocessing.Pool(processes=5)
        for index, sheet in enumerate(sheets):
            result.append(pool.apply_async(proxy, (self, sheet)))
        pool.close()
        pool.join()
        for data in result:
            print(data.get())
    @staticmethod
    def test(args):
        return args
if __name__ == '__main__':
    A().run()

修改后的代码将方法test定义为一个静态方法,这样就可以被序列化了。通过运行修改后的代码,就可以避免出现multiprocessing Can't pickle 的错误了。

0