Flask 3.0 不存在,当前最新稳定版为 Flask 2.3.3;其 async 视图需 ASGI 服务器(如 Uvicorn/Hypercorn)才能真正异步执行,flask run 仅限开发,gunicorn 默认不支持 asyncio,混用会触发 RuntimeError。

Flask 3.0 本身不运行在 Uvicorn 上就能支持 async 视图——但必须用 Uvicorn(或 Hypercorn)启动,否则 async 路由会静默失败或卡住。
为什么不能用 flask run 或 gunicorn
Flask 3.0 的 async 视图依赖 asyncio 事件循环调度协程,而:
-
flask run(Werkzeug 3.0+)虽内置 asyncio 支持,但仅限开发调试;生产环境多进程下 event loop 不共享,await会抛RuntimeError: no running event loop -
gunicorn默认走同步 worker 模式,即使配gevent也是 greenlet,和asyncio不兼容——await直接失效或崩溃 - 只有 ASGI 服务器(如
uvicorn)能正确挂载、分发、调度 Flask 的 async endpoint
uvicorn 启动 Flask 3.0 的最小可行命令
确保你已安装 Flask 3.0+ 和 uvicorn(推荐带优化组件):
pip install "flask[async]" "uvicorn[standard]"
假设你的应用入口是 app.py 中的 app 实例:
立即学习“Python免费学习笔记(深入)”;
- 开发模式(单进程 + 热重载):
uvicorn app:app --reload --host 0.0.0.0 --port 8000 - 生产模式(多进程,禁用 reload):
uvicorn app:app --workers 4 --host 0.0.0.0 --port 8000 - 注意:
--reload和--workers > 1不能共存,否则子进程无法正确监听文件变更
async 视图里哪些操作会拖垮性能?
async 视图 ≠ 自动高性能。一旦混入阻塞调用,整个 event loop 就被卡住:
- 禁止用
requests.get()、sqlite3.connect()、open()同步读文件等——全部会阻塞 event loop - 必须换为异步替代品:
httpx.AsyncClient替代requests;SQLAlchemy 2.0+ 的create_async_engine+AsyncSession替代session.query() - 普通 CPU 密集型任务(如 JSON 解析、正则匹配)仍建议用
loop.run_in_executor转移,避免长时间占用协程线程
容易被忽略的配置细节
Uvicorn 默认配置对 Flask 3.0 的 async 场景并不“开箱即用”:
-
--timeout-keep-alive 5:长连接超时太短会导致 WebSocket 或流式响应提前断开,建议设为30或更高 -
--limit-concurrency 100:不设的话高并发下可能耗尽连接,尤其配合数据库 async pool 时需对齐 - 日志级别设为
--log-level warning更稳妥——debug会大量打印 ASGI 生命周期细节,掩盖真正业务问题 - 不要手动调用
asyncio.run()或新建EventLoop:Uvicorn 已管理好主 loop,重复初始化会报错
最常出问题的地方不是“怎么写 async”,而是“哪条语句偷偷切回了同步上下文”。检查每个 await 表达式背后是否真由 asyncio 驱动,比堆砌 async 关键字重要得多。


















