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

Flask应用后台运行函数:属于异步还是多线程问题?

问题

我在Flask中开发了一个Web应用路由,该路由需在用户触发30分钟后为其提供数据分析。触发路由后,会先调用API获取初始数据,随后休眠1800秒,再次调用同一API获取最终数据,将两者差值作为30分钟内的增量数据upsert至数据库。示例代码如下:

@app.route("/data/", methods=['GET', 'POST', 'UPDATE'])
@login_required
def data():
    Url = "https://data-api.com"
    payload={}
    headers = {
    'Authorization': AUTH
    }
    response = requests.request("GET", Url, headers=headers, data=payload)
    
    data_json = json.loads(response.text)
    data1_init = data_json["a"]["b"]["c"]
    data2_init = data_json["e"]["f"]["g"]
    data3_init = data_json["h"]["i"]["j"]
    
    sleep(1800)

    Url = "https://data-api.com"
    payload={}
    headers = {
    'Authorization': AUTH
    }
    response = requests.request("GET", Url, headers=headers, data=payload)
    
    data_json = json.loads(response.text)
    data1_final = data_json["a"]["b"]["c"]
    data2_final = data_json["e"]["f"]["g"]
    data3_final = data_json["h"]["i"]["j"]

    data1 = data1_final - data1_initial
    data2 = data2_final - data2_initial
    data3 = data3_final - data3_initial
    
    data_info = DBModel(data1=data1, data2=data2, data3=data3)
    db.session.commit()
    
    return render_template('loading.html')

我希望用户在该函数运行期间仍能使用网站其他功能,甚至可再次触发该函数的实例。想请教:这属于异步问题还是多线程问题?我更关注概念层面而非具体代码。

回答

从概念层面来说,你的需求同时涉及异步和多线程的范畴,但核心要解决的是请求线程被阻塞的问题:

  • 当前代码的核心问题:Flask默认是单线程同步模式,你的路由函数里的sleep(1800)是阻塞操作,会占用当前请求的线程,导致这个线程在30分钟内无法处理其他请求——用户不仅没法用网站其他功能,连再次触发该路由的请求都会排队等待。

  • 多线程的定位:多线程是解决这类问题的一种实现思路。把耗时的任务(休眠+二次API调用+数据入库)放到独立线程中执行,主线程可以立即返回响应、释放资源去处理其他用户请求,包括再次触发该路由的新请求。每个任务实例会在单独线程里运行,互相不干扰。

  • 异步的定位:异步是另一种非阻塞思路,基于事件循环实现,通过非阻塞IO操作避免线程闲置。比如把sleep换成异步休眠,同步requests调用换成异步HTTP客户端,主线程不会被阻塞,可在等待间隙处理其他任务。它和多线程的核心区别是:多线程是操作系统层面的任务调度,异步是应用层面的任务切换。

  • 你的场景本质:你需要的是让耗时任务不阻塞Web服务主线程,同时支持多个任务实例并行执行——这个需求既可以用多线程实现,也可以用异步实现,甚至可以用任务队列这类更适合长时间任务的方案。但从概念归类上,这属于解除请求线程阻塞的问题,多线程和异步只是解决这个问题的不同技术路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:36:23