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

如何配置Flask先启动监听套接字,延迟初始化并阻塞请求至完成?

配置Flask实现先监听套接字再执行耗时初始化并阻塞未完成前的请求

现成库解决方案

  • Flask-LazyLoad:专门针对Flask的延迟初始化场景设计,能让应用先启动监听端口,再在后台线程执行加载AI模型这类耗时任务。初始化完成前,所有请求会被自动阻塞,直到任务结束才开始处理,完全匹配你的需求,无需自行编写复杂逻辑。
  • Flask-Executor:原本用于异步任务处理,也可适配这个场景。启动应用时提交初始化任务,再编写一个中间件检查任务状态,未完成时阻塞请求,直到初始化结束。

手动实现方案(无需第三方库)

如果不想依赖外部库,也可以快速实现:

  1. 初始化Flask应用时,创建一个后台线程执行耗时的初始化逻辑,用threading.Event作为初始化完成的标志(比普通布尔值更线程安全)。
  2. 添加一个请求前置钩子,在每个请求到达时检查标志状态,未完成则等待,完成后再处理请求。

示例代码:

from flask import Flask
import threading
import time

app = Flask(__name__)
# 初始化完成事件标志
init_completed = threading.Event()

def init_ai_model():
    # 模拟加载AI模型的耗时操作
    time.sleep(30)
    print("初始化完成:AI模型加载完毕")
    # 设置标志,表示初始化完成
    init_completed.set()

# 启动后台初始化线程
threading.Thread(target=init_ai_model, daemon=True).start()

# 请求前置钩子:阻塞未完成初始化的请求
@app.before_request
def wait_for_initialization():
    if not init_completed.is_set():
        # 等待直到初始化完成
        init_completed.wait()

@app.route('/api/data')
def get_data():
    return "处理请求:返回AI模型生成的结果"

if __name__ == '__main__':
    # 先启动监听,后台并行执行初始化
    app.run(host='0.0.0.0', port=5000)

这个实现和你回忆的旧版Tomcat特性一致:请求会保持连接打开,待初始化完成后立即处理并返回响应,开发阶段可以提前发起请求,不用等初始化结束再操作前端。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:57:13