【Python系列】fastapi和flask中的阻塞问题

博客目录

      • [🔍 场景还原](#🔍 场景还原)
      • [✅ 根本原因分析](#✅ 根本原因分析)
        • [✅ 1. 单 worker 模型导致**请求排队**](#✅ 1. 单 worker 模型导致请求排队)
        • [✅ 2. **循环依赖 + 同步阻塞** 导致**死锁**](#✅ 2. 循环依赖 + 同步阻塞 导致死锁)
        • [✅ 3. **超时打破死锁**](#✅ 3. 超时打破死锁)
      • [🧠 总结一句话](#🧠 总结一句话)
      • [✅ 解决方案建议](#✅ 解决方案建议)
      • [📌 小贴士](#📌 小贴士)

fastapi 使用的是 uvicorn 一个 worker

请求 flask 的一个接口,flask 使用的是 gunicorn 也是一个 worker

从 fastapi 发送了一个请求到 flask 的接口,在 flask 的这个接口中,又请求和 fastapi 服务的一个异步方法,2 个系统都会阻塞,

但是将请求 fastapi 的接口设置一个超时时间,则超时后,2 个系统可以正常使用

这个场景,本质上是一个同步阻塞 + 循环依赖 + 单工作进程 导致的死锁 问题。


🔍 场景还原

  • FastAPI 服务:

    • 使用 uvicorn 单 worker(--workers 1)。
    • 同步接口(或异步接口中用了阻塞调用)调用了 Flask 的接口。
  • Flask 服务:

    • 使用 gunicorn 单 worker(--workers 1)。
    • 接口内部又调用了 FastAPI 的一个异步接口(或同步接口,但阻塞等待)。
  • 结果:

    • 两个服务都阻塞,无法响应后续请求。
    • 一旦给其中一方的请求设置超时 ,超时后,两个系统恢复。

✅ 根本原因分析

✅ 1. 单 worker 模型导致请求排队
  • uvicorn 和 gunicorn 在单 worker 模式下,只有一个进程处理请求。
  • 如果当前请求没有处理完 ,新请求会被排队 ,不会被处理。
✅ 2. 循环依赖 + 同步阻塞 导致死锁
  • FastAPI 请求 Flask → Flask 请求 FastAPI。
  • 此时:
    • FastAPI 的 worker 正在等待 Flask 的响应(阻塞)。
    • Flask 的 worker 正在等待 FastAPI 的响应(也阻塞)。
  • 两个服务的唯一 worker 都在等待对方 ,没有空闲 worker 处理新请求。
  • 形成死锁。
✅ 3. 超时打破死锁
  • 一旦其中一方(如 FastAPI 请求 Flask)设置了超时时间 :
    • 超时后,FastAPI 放弃等待,释放了自己的 worker。
    • FastAPI 的 worker 恢复后,可以处理 Flask 发来的请求。
    • Flask 收到响应后,也释放了自己的 worker。
  • 死锁被打破,系统恢复。

🧠 总结一句话

单 worker + 同步阻塞 + 循环调用 = 死锁;超时打破等待,释放 worker,死锁解除。


✅ 解决方案建议

方案 说明
✅ 增加 worker 数量 至少 2 个 worker,避免单点阻塞。
✅ 避免同步循环调用 用消息队列(如 Redis + Celery)解耦。
✅ 使用异步非阻塞调用 FastAPI 端用 httpx.AsyncClient,Flask 端用 aiohttp 或 httpx,但注意 Flask 本身不支持异步视图(除非用 quart 或 flask 2.x + asgiref)。
✅ 设置超时 作为兜底机制,防止死锁永久挂起。

📌 小贴士

  • 单 worker 模式只适合开发调试,生产环境务必多 worker。
  • 如果你用的是 sync 视图 + requests 库,一定是阻塞的,即使 FastAPI 是异步框架。

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
huisheng_qaq1 小时前
【Python基础篇-04】深入理解python的函数、参数与作用域
python·ai·函数·参数作用域
宸津-代码粉碎机6 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
Y3815326626 小时前
SERP API 计费口径:credits_charged、执行失败扣费与退款边界
python·搜索引擎
蒸鱼Yuzheng8 小时前
设备端性能工件可靠导出:断点续传、哈希、manifest 与失败恢复
android·自动化测试·python·adb·数据完整性
像风一样自由20208 小时前
41.用FastAPI搭建一个RAG后端需要哪些接口
人工智能·大模型·fastapi·rag·智能体
圆圆讲门店9 小时前
挑选同城获客服务机构时需要考量的核心因素都有哪些?
大数据·网络·人工智能·python
傻啦嘿哟9 小时前
Python的默认参数把我坑惨了,原来写[]和写None的区别这么大
开发语言·python·机器学习
微小冷9 小时前
Python凸优化cvxpy初步
python·机器人·凸优化·数学规划·cvxpy
在世修行9 小时前
干货:显式映射 vs 自动判据
python·插件
xzal129 小时前
Python之简单理解栈和队列
python