Flask服务异步响应异常求助:线程未后台执行排查
Flask接口使用threading无法立即返回响应
问题背景
我有两个服务:Service A(Node.js)与Service B(Flask)。Service A通过以下代码调用Service B的接口:
const response = await axios.get( endpoint_url, { params: { library_id: req.query.library_id, }, } );
Service B的该接口对应图书库更新路由,会通过for循环批量更新指定图书馆的所有图书,操作耗时较长。我希望Service B能立即向Service A返回响应,将计算任务放在后台执行。可选方案有asyncio、threading、celery等,我选择了threading实现,但出现异常:启动线程后,process函数会完整执行完毕才返回响应,testing也未立即打印。
Service B的接口代码如下:
import threading from src.Library import Library @bp_csv.route('update-library', methods=['GET']) def get_library(): library_id = request.args.get('library_id') if not library_id: raise ValueError("Missing query parameter 'library_id' ") LIB = Library(library_id) thread = threading.Thread(target=LIB.process()).start() print("testing") status_code = 202 return_message = "Updating library" response = make_response( jsonify({"message": str(return_message)}), status_code) response.headers["Content-Type"] = "application/json" return response
问题根源
你在创建线程时犯了一个关键错误:threading.Thread(target=LIB.process()) 里的 LIB.process() 是直接执行了这个函数,而不是把函数对象传递给target参数。这就导致主线程会先等待process函数完全执行完毕,才会继续往下执行print("testing")和返回响应,根本没有启动新的后台线程。
修正方案
把线程创建的代码修改为:
# 只传递函数对象,不要加括号调用 thread = threading.Thread(target=LIB.process) thread.start()
如果process方法需要接收额外参数,可以通过args参数传递(参数以元组形式传入):
thread = threading.Thread(target=LIB.process, args=(额外参数1, 额外参数2)) thread.start()
额外提示
- Flask默认的开发服务器是单线程模式,若在生产环境部署,建议使用支持多线程的WSGI服务器(如Gunicorn)。
- 这种简单的后台线程方案存在局限性:一旦Flask进程意外终止,后台任务会直接中断。如果需要更稳定、可监控的异步任务处理,推荐使用Celery这类专业的任务队列工具。
内容的提问来源于stack exchange,提问作者SunAns
相关产品推荐
相关产品推荐

