使用Python multiprocessing的Pool.map时为何报History对象不可调用错误?
问题原因与解决方法
错误根源
你代码里的p.map(self.function(), numbers)犯了一个关键错误:self.function()会立即执行这个实例方法,返回一个History对象。而Pool.map要求第一个参数是可调用对象(函数/方法引用),它会把这个对象当成函数去调用,自然就会报“History object is not callable”——因为你传的是方法执行后的结果,不是方法本身。
修正步骤
1. 传递方法引用而非执行结果
首先把self.function()改成self.function,直接传方法的引用:
p = Pool(process_count) numbers = [1] * process_count results = p.map(self.function, numbers) p.close() p.join()
2. 处理无参数方法与map的参数要求
Pool.map会自动把numbers里的每个元素作为参数传给目标方法,但你的方法是无参数的,所以需要做以下任一调整:
- 修改方法定义,添加占位参数:
def function(self, unused_param): # 原方法逻辑,忽略unused_param即可 return History(...) - 用
functools.partial包装方法,屏蔽参数:
不需要修改原方法,用partial包装后忽略传入的参数:from functools import partial p = Pool(process_count) numbers = [1] * process_count wrapped_func = partial(self.function) results = p.map(wrapped_func, numbers) p.close() p.join()
3. 额外注意:多进程的序列化问题
如果你的类实例(self)无法被Python的pickle模块序列化,还会遇到新的报错。这种情况下可以把方法改成静态方法,或者用Pool的initializer参数提前初始化实例。
内容的提问来源于stack exchange,提问作者Riccardo Caiulo
相关产品推荐
相关产品推荐

