从实战理解异步、并发并行与GIL:FastAPI vs SpringBoot

文章目录

  • [从实战理解异步、并发并行与GIL:FastAPI vs SpringBoot](#从实战理解异步、并发并行与GIL:FastAPI vs SpringBoot)
    • [一、async/await 到底在干嘛?](#一、async/await 到底在干嘛?)
    • [二、GIL 是什么?现在还有吗?](#二、GIL 是什么?现在还有吗?)
    • [三、并发 vs 并行,一句话分清](#三、并发 vs 并行,一句话分清)
    • [四、SpringBoot 多线程:提升的是什么?](#四、SpringBoot 多线程:提升的是什么?)
    • [五、4 核 CPU,两个进程各开 4 线程会怎样?](#五、4 核 CPU,两个进程各开 4 线程会怎样?)
    • [六、回到接口开发:FastAPI vs SpringBoot](#六、回到接口开发:FastAPI vs SpringBoot)
    • 七、有GIL限制,开启多线程有什么用
    • 七、总结

从实战理解异步、并发并行与GIL:FastAPI vs SpringBoot

在写业务接口时,我一直有几个疑惑:FastAPI 为什么必须写 async/await?SpringBoot 不用异步也能高并发?Python 的 GIL 到底有什么影响?并发和并行到底是不是一回事?

结合实际开发场景,把这些问题一次性捋清楚。

一、async/await 到底在干嘛?

  • async:标记这是一个异步函数
  • await:标记这里是IO 等待,线程可以先去干别的

执行流程

  1. 线程处理接口逻辑(参数解析、SQL 拼接)
  2. 遇到 await DB 等 IO,线程释放
  3. 线程去处理其他请求
  4. DB 返回结果,线程再回来继续执行

只有 IO 等待时才切换,CPU 计算时不切换。

二、GIL 是什么?现在还有吗?

  • GIL:全局解释器锁,CPython 特有
  • 作用:同一时刻,一个进程只能有一个线程执行 CPU 指令
  • 现在依然存在,并没有被移除

影响

  • Python 多线程对 CPU 密集型任务提速有限
  • 但 IO 密集型(接口、查询 DB)几乎不受影响,异步依旧高效

三、并发 vs 并行,一句话分清

  • 并发 :任务数 > 处理能力,交替切换执行(单核也能实现)
  • 并行 :多核同时跑多个任务,真·同时执行

并发是"看上去同时处理",并行是"物理上同时运行"。

四、SpringBoot 多线程:提升的是什么?

SpringBoot 采用线程池模型,来一个请求分配一个线程。

  • 4 核 CPU:同一时刻最多 4 个线程并行
  • 更多线程:系统快速切换,实现并发

本质:
靠多线程实现并行,最终对外表现为高并发能力。

五、4 核 CPU,两个进程各开 4 线程会怎样?

总共 8 个线程,但只有 4 个核心:

  • 同一时刻最多 4 个线程真正并行
  • 其余线程由系统调度,并发交替执行
  • 效率提升,但无法达到线性翻倍

六、回到接口开发:FastAPI vs SpringBoot

FastAPI(Python)

  • 模型:单线程 + 异步协程
  • 靠 IO 等待时切换实现高并发
  • 适合接口、查询、数据分析等 IO 密集型场景

SpringBoot(Java)

  • 模型:多线程 + 线程池
  • 靠多核并行实现高并发
  • 同步写法,底层已自动并发

七、有GIL限制,开启多线程有什么用

GIL限制了在同一进程中,只能有一个线程跑CPU的代码

异步代码

  • 由于是异步的,遇到IO就是释放,线程会到下一个任务执行CPU代码,CPU代码一直有线程执行,所以多线程没有。

同步代码

  • 由于是同步的,遇到IO会等待,这个时候,另一个线程就可以执行CPU代码,提高效率。

七、总结

  1. async/await 是为了在 IO 等待时不阻塞线程
  2. GIL 还在,但不影响接口类 IO 密集场景
  3. 并发 = 切换着做,并行 = 同时做
  4. SpringBoot 多线程 = 并行实现高并发
  5. FastAPI 异步 = 单线程切换实现高并发

Python 完全能做大型接口项目,只要是 IO 密集型,FastAPI 效率极高。

相关推荐
二哈赛车手6 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~7 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8297 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
未若君雅裁8 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记9 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI9 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
辰海Coding10 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
小小编程路10 小时前
C++ 多线程与并发
java·jvm·c++
AI视觉网奇11 小时前
linux 检索库 判断库是否支持
java·linux·服务器