You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 03:15:11