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)