如何配置Flask先启动监听套接字,延迟初始化并阻塞请求至完成?
配置Flask实现先监听套接字再执行耗时初始化并阻塞未完成前的请求
现成库解决方案
- Flask-LazyLoad:专门针对Flask的延迟初始化场景设计,能让应用先启动监听端口,再在后台线程执行加载AI模型这类耗时任务。初始化完成前,所有请求会被自动阻塞,直到任务结束才开始处理,完全匹配你的需求,无需自行编写复杂逻辑。
- Flask-Executor:原本用于异步任务处理,也可适配这个场景。启动应用时提交初始化任务,再编写一个中间件检查任务状态,未完成时阻塞请求,直到初始化结束。
手动实现方案(无需第三方库)
如果不想依赖外部库,也可以快速实现:
- 初始化Flask应用时,创建一个后台线程执行耗时的初始化逻辑,用
threading.Event作为初始化完成的标志(比普通布尔值更线程安全)。 - 添加一个请求前置钩子,在每个请求到达时检查标志状态,未完成则等待,完成后再处理请求。
示例代码:
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
相关产品推荐
相关产品推荐

