并发与并行(concurrency and parallelism)

最后发布时间:2025-05-13 14:38:37 浏览量:

异步代码(asynchronous code )的思想有时也被称为“并发”(concurrency),它不同于“并行”(parallelism)
spring boot的@Async 实际是并发,需配合线程池才能实现并行。

在 Spring Boot(实际上是基于 Spring MVC 或 Spring WebFlux)中,每个 HTTP 请求的处理默认是并发的,但是否并行执行,取决于底层的线程模型。

下面是更具体的解释:

一、Spring Boot 默认使用 Spring MVC(Servlet 模型)

特性:

  • 并发(Concurrent): 每个 HTTP 请求由一个独立的线程处理,请求之间是并发执行的。
  • 并行(Parallel): 如果系统有多个 CPU 核心,并且线程池有足够线程数,那么多个请求会并行在多个 CPU 上运行。

技术细节:

  • 使用 Tomcat、Jetty 或 Undertow 作为 Servlet 容器。
  • 每个请求由 Servlet 容器的线程池(通常是 Http11NioProtocol 线程池)分配线程处理。

示例场景:

  • 10 个请求几乎同时到来,容器线程池有 10 个空闲线程。
  • 则这 10 个请求会同时(并发)处理,在多核机器上,它们甚至会并行执行

二、Spring WebFlux(响应式模型)

如果你的 Spring Boot 应用使用 WebFlux:

  • 使用 Netty 服务器。
  • 采用事件驱动的非阻塞 I/O 模型。
  • 同样是并发处理请求,但不再为每个请求分配一个线程,而是用更少的线程通过异步回调机制处理多个请求。
  • 更加高效,适合高并发低延迟场景。

总结:

模型并发并行线程模型
Spring MVC✅(多核 CPU)每请求一个线程
Spring WebFlux✅(依赖 Reactor)少量线程,事件驱动处理

补充:如何验证?

你可以在控制器里打印当前线程名:

@GetMapping("/test")
public String test() {
System.out.println("Thread: " + Thread.currentThread().getName());
return "OK";
}

同时发起多个请求,你会看到它们由不同线程(如 http-nio-8080-exec-1)处理,证明是并发的。

Spring WebFlux 和 Python FastAPI 的 async 都是异步非阻塞模型,但底层机制并不一样,它们的设计理念相似,但实现方式和运行模型是完全不同的。下面是对比分析:

✅ 相同点:设计理念一致

特性Spring WebFluxFastAPI (async)
异步非阻塞处理
基于事件驱动✅(Reactor 模型)✅(基于 asyncio
每个请求不占一个线程
适合 I/O 密集型场景

两者都试图解决传统每请求一个线程的资源浪费问题,尤其在高并发下更显优势。

❌ 不同点:底层机制有很大差异

一、编程模型差异

方面Spring WebFluxFastAPI
异步库Reactor(Project Reactor)asyncio(Python 标准库)
核心类型Mono<T>, Flux<T>async def, await
控制流写法响应式流编程风格(类似 RxJava)类似同步代码的异步语法糖
难易程度相对复杂(响应式流不直观)简单(接近同步代码)

WebFlux 使用的是响应式编程风格,而 FastAPI 的 async 是协程语法,更直观。

二、运行机制差异

方面Spring WebFluxFastAPI (async)
I/O 模型Netty(基于 Java NIO 的事件循环)asyncio(基于单线程事件循环)
多线程使用有限线程池(Netty Event Loop)单线程或协程调度器运行在一个线程中
并行能力多线程并发/并行多任务并发(单线程并发),并行需用多进程
底层调度Reactor Scheduler(Reactive Streams)asyncio 事件循环(Python 协程模型)

🧠 举个比喻:

  • Spring WebFlux:是一个高级响应式流水线,有多个工人(线程)分工合作,用非常细粒度的方式处理数据流。
  • FastAPI:是一个快节奏的单线程厨师,通过协程快速在不同的锅之间切换炒菜,不会等锅煮熟才动手做下一个菜。

🧪 性能比较(大概趋势)

场景更合适的选择
高并发 Web API两者都很合适
CPU 密集型操作都需结合线程池/进程池
响应式流处理WebFlux 更专业
快速开发、易读性FastAPI 更友好

✅ 总结:

对比项Spring WebFluxFastAPI (async)
编程风格响应式编程,函数式流式处理协程编程,语义清晰,接近同步思维
底层机制Netty + Reactorasyncio + 单线程事件循环
性能(高并发)强(线程池 + 非阻塞 I/O)强(协程 + 非阻塞 I/O)
学习曲线较陡峭(响应式流模型复杂)较平滑(async/await 更自然)

如果你想要更具体的比较(比如实际开发体验、部署、错误处理等方面),可以告诉我你的使用场景,我可以更针对性地给建议。