AttributeError:无法腌制本地对象“ SomeClass.some_method..single”
您可以通过将嵌套的目标函数single()
移到顶层来自己解决此错误。
Pool需要对其发送到其工作进程(IPC)的所有内容进行腌制(序列化)。酸洗实际上仅保存函数的名称,而酸洗则需要按名称重新导入该函数。为此,必须在顶层定义函数,子级将不能导入嵌套函数,并且已经尝试将其腌制会引发异常。
AttributeError:无法从“ … / test.py”获取模块“ main”上的属性“ single”
您 在 定义函数和类 之前 先启动池,这样子进程就不能继承任何代码。将您的池启动到最底部并用以下方法保护(为什么?)if __name__ == '__main__':
import multiprocessing
class OtherClass:
def run(self, sentence, graph):
return False
def single(params):
other = OtherClass()
sentences, graph = params
return [other.run(sentence, graph) for sentence in sentences]
class SomeClass:
def __init__(self):
self.sentences = [["Some string"]]
self.graphs = ["string"]
def some_method(self):
return list(pool.map(single, zip(self.sentences, self.graphs)))
if __name__ == '__main__': # <- prevent RuntimeError for 'spawn'
# and 'forkserver' start_methods
with multiprocessing.Pool(multiprocessing.cpu_count() - 1) as pool:
print(SomeClass().some_method())
…我希望将工作分散到我的所有核心。
有关multiprocessing.Pool
分块工作方式的潜在帮助背景: