gpt4 book ai didi

python多处理: AttributeError: Can't pickle local object

转载 作者:行者123 更新时间:2023-12-04 12:16:33 69 4
gpt4 key购买 nike

我在一个类中有一个方法来返回一个参数可能会改变的函数。

Interface函数接受两个参数,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'

我尝试了 3 种方法:

What can multiprocessing and dill do together?

Replace pickle in Python multiprocessing lib

Python Multiprocessing Pool Map: AttributeError: Can't pickle local object

方法一、二:
 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 需要更改代码,但是我不能简单地将 func 移出类,因为我需要 f 作为接口(interface)的参数。

你有什么建议吗?我是一个没有经验的新人。

最佳答案

Python 不能腌制闭包,但您真正需要的是可以调用的保留状态的东西。 __call__方法使类实例可调用,因此使用它

from multiprocessing import Pool

class TempTest1:

def __init__(self, a):
self.a = a

def __call__(self, x):
return self.a + x

class Temp:
def __init__(self, a):
self.a = a

def test(self):
return TempTest1(self.a)

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)
print(res2)

关于python多处理: AttributeError: Can't pickle local object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62186218/

69 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com