我在一个类中有一个方法,可以返回一个参数可能会改变的函数。
这个接口函数接受两个参数:f 和它的 args。我想使用 mp.pool 来加速它的运行,但是出现了错误。
from multiprocessing import Pool
# from multiprocess import Pool
# from pathos.multiprocessing import ProcessingPool as Pool
import pickle
import dill
class Temp:
def __init__(self, a):
self.a = a
def test(self):
def test1(x):
return self.a + x
return test1
def InterfaceFunc(f, x):
mypool = Pool(4)
return list(mypool.map(f, x))
if __name__ == "__main__":
t1 = Temp(1).test()
x = [1, 2, 3, 1, 2]
res1 = list(map(t1, x))
print(res1)
res2 = InterfaceFunc(t1, x)
它会引发相同的错误:
AttributeError: Can't pickle local object 'Temp.test.<locals>.test1'
我尝试了三种方法:
替换Python multiprocessing库中的pickle
Python Multiprocessing Pool Map:AttributeError:无法pickle本地对象
方法1、2:
from multiprocess import Pool
from pathos.multiprocessing import ProcessingPool as Pool
这会引发错误:
File "E:\Users\ll\Anaconda3\lib\site-packages\dill\_dill.py", line 577, in _load_type
return _reverse_typemap[name]
KeyError: 'ClassType'
Method3需要更改代码,但我不能简单地将该函数移出该类,因为我需要f作为接口的参数。
你有什么建议吗?我是一个缺乏经验的新手。