使用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
相关产品推荐
相关产品推荐

