python 多进程 AttributeError: Cant pickle local object

python闭包不支持pickle(序列化)。多进程需要函数能pickle。
有几种方式解决:
0.将函数体中的函数挪出。
这是最简单的方法。但是有时因为函数接口已经给定,需要使用函数来定义函数。考虑以下两种方法。
1.更换pickle,考虑以下代码:

 from pathos.multiprocessing import ProcessingPool as Pool

网址
https://github.com/uqfoundation/pathos

2.避免使用闭包
错误代码(报错)

from multiprocessing import Pool


def test1(args):
    def test2(t):
        return args + t
    return test2

if __name__ == "__main__":
    p = Pool(4)
    result = p.map(test1(10), [i for i in range(10)])
    p.close()
    p.join()

    print(result)

改进

from multiprocessing import Pool


class test1:
    def __init__(self, args):
        self.args = args

    def __call__(self, t):
        return self.args + t


if __name__ == "__main__":
    p = Pool(4)
    result = p.map(test1(10), [i for i in range(10)])
    p.close()
    p.join()

    print(result)

你可能感兴趣的:(python 多进程 AttributeError: Cant pickle local object)