一、基础并发概念
-
异步(Asynchronous)
- 定义:任务执行无需等待前序操作完成,通过回调、Promise等机制获取结果。
- 特点:非阻塞式,提升响应性(如UI操作、网络请求)。
- 实现:单线程事件循环(JavaScript)、协程(Python)。
- 对比:与同步相对,同步需等待任务完成(如
fs.readFileSync
)。
-
并行(Parallelism)
- 定义:多个任务在同一时刻真正同时执行,依赖多核CPU。
- 特点:直接提升计算效率(如科学计算、图像渲染)。
- 实现:多进程、多线程、分布式计算。
- 对比:并行是并发的子集(并发关注任务管理,并行关注执行方式)。
-
多线程(Multithreading)
- 定义:同一进程内多个执行单元,共享进程资源。
- 特点:轻量级并发,上下文切换开销小,需处理线程安全(锁、信号量)。
- 应用:GUI响应、后台任务处理。
-
多任务(Multitasking)
- 定义:操作系统同时管理多个进程/线程,通过时间片轮转实现“伪并行”。
- 特点:宏观并发,微观交替执行(如浏览器同时处理渲染、下载)。
- 对比:多任务包含多进程和多线程。
二、进阶并发模型
-
协程(Coroutine)
- 定义:用户态轻量级线程,由程序显式调度(非抢占式)。
- 特点:单线程内实现并发,无锁机制,适合I/O密集型任务。
- 实现:Python的
asyncio
、Go的goroutine
、JavaScript的Promise
。 - 对比:比线程更轻量,但需语言或框架支持。
-
事件驱动(Event-Driven)
- 定义:程序流程由事件触发(如用户输入、定时器)。
- 特点:高响应性,适合实时系统(如游戏引擎、GUI)。
- 实现:事件循环(Node.js)、回调函数、消息队列。
-
线程池/任务队列
- 定义:预先创建线程池管理任务,避免频繁创建/销毁线程的开销。
- 特点:资源复用,控制并发量(如Java的
ExecutorService
)。 - 应用:高并发Web服务器、批量任务处理。
三、同步与通信机制
-
同步(Synchronization)
- 定义:协调多个线程/进程的执行顺序,避免竞态条件。
- 实现:锁(Mutex)、信号量(Semaphore)、条件变量(Condition Variable)。
- 场景:共享资源访问(如数据库连接池)。
-
互斥(Mutex)
- 定义:确保同一时间仅一个线程访问临界资源。
- 对比:与信号量不同,互斥仅允许单线程进入临界区。
-
进程间通信(IPC)
- 定义:不同进程间交换数据(如共享内存、管道、消息队列)。
- 场景:分布式系统、多进程协作(如Chrome浏览器多进程架构)。
四、编程范式与框架
-
响应式编程(Reactive Programming)
- 定义:以数据流和变化传播为核心,响应异步事件(如RxJS、Reactor)。
- 特点:声明式编程,适合处理实时数据流(如WebSocket消息)。
-
非阻塞I/O
- 定义:I/O操作不阻塞线程,通过事件通知机制处理完成状态。
- 实现:epoll(Linux)、kqueue(BSD)、Node.js的
fs.readFile
。
-
Actor模型
- 定义:并发单元为独立的Actor,通过消息传递通信。
- 特点:无共享状态,天然支持分布式(如Akka框架)。
- 对比:与线程模型不同,Actor模型抽象层次更高。
五、系统级扩展概念
-
分布式计算
- 定义:任务拆分到多台机器协同处理(如MapReduce、Spark)。
- 特点:横向扩展,容错性强,适合大数据处理。
-
虚拟线程(Virtual Threads)
- 定义:由JVM管理的轻量级线程,与操作系统线程1:1或M:N映射。
- 特点:高密度并发,降低资源消耗(如Java的Project Loom)。
-
数据流编程(Dataflow Programming)
- 定义:以数据流动为中心,节点间通过数据依赖触发执行。
- 应用:图形化编程(如KNIME)、流处理框架(如Apache Flink)。
六、关键对比与选型
维度 | 异步 | 并行 | 协程 | 事件驱动 |
---|---|---|---|---|
核心目标 | 非阻塞执行 | 利用多核提升效率 | 轻量级并发 | 事件触发任务执行 |
实现层级 | 编程模型 | 硬件/系统架构 | 语言或框架支持 | 事件循环机制 |
适用场景 | I/O密集型任务 | CPU密集型计算 | 高并发网络服务 | 实时系统、GUI |
典型工具 | JavaScript的async/await | OpenMP、MPI | Python的asyncio | Node.js、RxJS |
七、总结
- 基础模型:异步解决阻塞问题,并行提升计算效率,多线程/多任务是操作系统层面的并发管理。
- 进阶模型:协程、事件驱动、Actor模型等提供更细粒度的控制,适应不同场景需求。
- 选型原则:
- I/O密集型:异步+单线程(如Node.js)。
- CPU密集型:多线程+并行(如Java线程池)。
- 实时响应:事件驱动+非阻塞I/O(如游戏引擎)。