最佳答案
我在一个类中有一个方法,它需要在一个循环中执行大量的工作,我希望将工作分散到所有的核中。
我编写了下面的代码,如果使用正常的 map()
,这个代码可以工作,但是使用 pool.map()
会返回一个错误。
import multiprocessing
pool = multiprocessing.Pool(multiprocessing.cpu_count() - 1)
class OtherClass:
def run(sentence, graph):
return False
class SomeClass:
def __init__(self):
self.sentences = [["Some string"]]
self.graphs = ["string"]
def some_method(self):
other = OtherClass()
def single(params):
sentences, graph = params
return [other.run(sentence, graph) for sentence in sentences]
return list(pool.map(single, zip(self.sentences, self.graphs)))
SomeClass().some_method()
AttributeError: 无法 pickle 本地对象‘ Some Class.some _ method. . single’
为什么不能腌制 single()
?我甚至尝试将 single()
移动到全局模块作用域(不在类中——使其独立于上下文) :
import multiprocessing
pool = multiprocessing.Pool(multiprocessing.cpu_count() - 1)
class OtherClass:
def run(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)))
SomeClass().some_method()
然后我得到了下面这些..。
AttributeError: 无法从’.../test.py’获取模块‘ 总台’上的‘ single’属性