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

使用flask_executor获取异步任务结果时触发TypeError错误

错误排查思路

核心错误定位

你代码里最直接的问题出在任务提交阶段:

self.executor.submit_stored(task_id, self.scan_and_collect())

这里你传入的是self.scan_and_collect()的执行结果(即字符串"Whatever!"),而非方法本身。submit_stored要求第二个参数是可调用对象(比如函数/方法引用),但你把字符串传进去了,导致后台线程尝试调用这个字符串,直接触发TypeError: 'str' object is not callable,这也是Future状态显示raised TypeError的原因。

分步排查&修复

  • 修正任务提交代码:把self.scan_and_collect()改成self.scan_and_collect(去掉括号),传递方法引用而非执行结果:

    self.executor.submit_stored(task_id, self.scan_and_collect)
    
  • 处理Future异常状态:当任务因提交错误抛出异常后,调用future.result()会重新抛出该异常。你可以在task_status里捕获异常,明确返回错误信息:

    future = self.executor.futures.pop(task_id)
    try:
        result = future.result()
        return jsonify({'status': 'done', 'result': result})
    except Exception as e:
        return jsonify({'status': 'failed', 'error': str(e)})
    
  • 避免依赖私有API:代码中使用了self.executor.futures._state(task_id),_state是私有方法,不同版本的flask_executor可能会修改或移除。建议用公开API获取状态:

    # 替代私有方法的方式
    future = self.executor.futures.get(task_id)
    if future:
        future_status = future.state
    
  • 检查任务内部逻辑:确保scan_and_collect中的self.data_collector.collect()和self.clearing_requester.request()没有抛出未捕获的异常,否则也会导致Future进入失败状态。可以给这两个方法加上异常捕获,或者在scan_and_collect里统一处理:

    def scan_and_collect(self):
        try:
            self.data_collector.collect()
            self.clearing_requester.request()
            return "Whatever!"
        except Exception as e:
            # 记录日志或返回错误信息
            return f"Error: {str(e)}"
    

内容的提问来源于stack exchange,提问作者Smok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:25:07