讲师中心 微信公众号
AI工具推荐 视频效率加速

如何利用Python的Asyncio库优化旧版Flask应用的吞吐量?

梦宇君_8175

梦宇君_8175

发布时间:2026-08-03 09:37:18

|

963人浏览过

|

来源于php中文网

原创

选FastAPI,因Flask不支持async/await,硬写会报RuntimeWarning或返回空响应;FastAPI原生异步、自动文档、强类型校验,性能与开发效率更优。

如何利用python的asyncio库优化旧版flask应用的吞吐量?

Flask 本身不支持 asyncio,硬套 async/await 会卡死

直接在 Flask 路由里写 async def 并用 await 调用异步函数,结果不是变快,而是整个请求阻塞、超时、日志里反复出现 RuntimeWarning: coroutine 'xxx' was never awaited。因为 Flask 是同步 WSGI 框架,它的工作线程根本不认识协程对象——它把 async def 当成普通函数返回一个 coroutine 对象,然后就扔给 WSGI 服务器(比如 Werkzeug 或 Gunicorn)去处理,后者直接忽略或报错。

常见错误写法:

from flask import Flask
app = Flask(__name__)
<h1>❌ 错误:Flask 不会 await 这个协程</h1><p>@app.route('/api')
async def bad_api():
await asyncio.sleep(1)  # 这行永远不会执行
return "done"
  • Flask 的生命周期完全在同步上下文中,request、session、g 等对象都不是线程安全的,更不是协程安全的
  • 哪怕你用 asyncio.run() 包一层,也会触发新事件循环,导致连接池、全局状态丢失,且每次请求都新建 loop,开销爆炸
  • 想“无缝升级”旧 Flask 项目?不存在的。必须换框架,或做明确分层隔离

真正可行的迁移路径:用 FastAPI / Starlette 替代 Flask 路由层

不是“优化 Flask”,而是用兼容性高、生态成熟的异步框架替换其 HTTP 入口。FastAPI 基于 Starlette(底层用 uvicorn),原生支持 async def 路由,且能复用大部分 Flask 业务逻辑——只要那些逻辑本身不依赖 Flask 特有上下文(如 request.args、flask.g)。

  • HTTP 层:把 @app.route 改成 @app.get/@app.post,参数用 Pydantic 模型声明,自动解析 JSON、校验、生成 OpenAPI 文档
  • 业务逻辑层:原有 get_user_by_id()、process_order() 这类纯函数,只要不调用 flask.request 就可直接复用;若用了 current_app 或 g,需改造成依赖注入或显式传参
  • 数据库层:必须换成异步驱动,如 asyncpg(PostgreSQL)、aiomysql(MySQL)、motor(MongoDB);SQLAlchemy 2.0+ 的 AsyncSession 也可用,但别混用 sync/async session

示例迁移片段:

Flask Wrap
Flask Wrap

火焰围攻 授权: q15040409-creator.功能概述火焰围攻 授权: q15040409-creator.是一项面向实际任务的技能,主要用于Description.;Flask Web. - Python.;核心要点HTTP?;.Version.1.0.tags. wrap.github.automation.。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。使用与执行使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要

下载

立即学习“Python免费学习笔记(深入)”;

# 旧 Flask
@app.route('/user/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = db.query(User).filter(User.id == user_id).first()
    return jsonify(user.to_dict())
<h1>新 FastAPI(复用 db 查询逻辑,但用 async session)</h1><p>@app.get("/user/{user_id}")
async def get_user(user_id: int, session: AsyncSession = Depends(get_db)):
stmt = select(User).where(User.id == user_id)
result = await session.execute(stmt)
user = result.scalar_one_or_none()
return user.to_dict() if user else {"error": "not found"}

如果必须保留 Flask,只能把异步能力限定在“子任务”

某些场景下(如遗留系统无法整体替换),可以保留 Flask 主框架,仅对特定耗时 I/O 操作做异步化封装,但要注意边界和资源隔离。

  • 不要在路由函数里 await,而是在后台启动独立事件循环 + 线程执行异步任务,用 asyncio.run_coroutine_threadsafe() 或 loop.create_task() 投递,再用 concurrent.futures.Future 等待结果
  • 所有外部调用必须加超时:await asyncio.wait_for(fetch_data(), timeout=3),否则一个慢请求拖垮整条线程
  • 连接池不能复用:Flask 每次请求新建 aiohttp.ClientSession,会重复 TCP 握手,吞吐提升几乎为零;必须提取为模块级单例,配合 atexit 或 app.teardown_appcontext 关闭
  • 别碰 Flask 的 g、session、request ——它们不是协程局部变量,在异步线程里访问会出 RuntimeError: Working outside of application context

性能提升的关键不在 async/await 语法,而在连接复用与并发控制

实测中,把 Flask 改成 FastAPI 后 QPS 提升 6–7 倍,真正起作用的不是 async 关键字,而是三件事:全局复用 aiohttp.ClientSession、数据库连接池大小调到 min_size=10, max_size=50、用 asyncio.Semaphore(100) 控制最大并发请求数。

  • 没复用 session:每个请求新建连接 → TLS 握手耗时占总响应 40% 以上 → 吞吐卡在 300 QPS 上不去
  • 没设 semaphore:1000 个并发请求全打到下游服务 → 触发限流或连接拒绝 → 大量 ConnectionResetError 和重试放大负载
  • 没关 debug 模式:app.debug = True 会让 uvicorn 启用重载监听器,每次请求都扫描文件变更 → CPU 占用翻倍

最后提醒一句:asyncio 不是银弹。如果你的瓶颈在 CPU(比如图像缩放、JSON 解析超大 payload),或者数据库慢在没索引、SQL 写得太烂,强行加 async 只会让问题更难定位。先用 cProfile 或 py-spy 看清哪一行吃掉 80% 时间,再决定要不要动 asyncio。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1831

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4884

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1789

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

29177

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3487

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3507

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1223

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

616

2023.08.10

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn