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

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()

额外提示

  1. Flask默认的开发服务器是单线程模式,若在生产环境部署,建议使用支持多线程的WSGI服务器(如Gunicorn)。
  2. 这种简单的后台线程方案存在局限性:一旦Flask进程意外终止,后台任务会直接中断。如果需要更稳定、可监控的异步任务处理,推荐使用Celery这类专业的任务队列工具。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:43:34