734 字
4 分钟
并发、并行、异步

核心定义#

  • 并发:多个任务在重叠时间段内执行(单核上下文切换)
  • 并行:多个任务同时执行(需多核硬件支持)
  • 异步:非阻塞任务调度,在等待I/O时释放线程执行其他任务 Rust 提供:
    • 线程(std::thread)实现并发/并行
    • async/await 语法 + 运行时(如 Tokio)实现异步
    • 并行库(如 rayon)简化数据并行处理

工作原理#

并发/并行#

通过 OS 线程或绿色线程(用户态线程)分割任务。线程间用通道(mpsc)或锁(Mutex)同步数据。

异步#

  1. 异步函数返回 Future(待执行任务)
  2. 运行时(如 Tokio)调度 Future,在 I/O 等待时挂起并执行其他任务
  3. I/O 就绪后唤醒任务继续执行
flowchart TD 
	A[启动任务] --> B{执行模式} 
	B -->|并发| C[单核切换执行 Task1/Task2] 
	B -->|并行| D[多核同时执行 Task1+Task2] 
	B -->|异步| E[Task1 等待I/O时执行 Task2] 
	C & D & E --> F[完成]

关键点#

  1. 线程安全Send(可跨线程传递)+ Sync(可线程间共享)trait 保障安全
  2. 异步运行时:需外部库(如 Tokio)提供任务调度和I/O事件驱动
  3. 零成本抽象:Rust 异步无运行时开销(编译期生成状态机)
  4. 数据并行rayon 的 par_iter() 自动拆分数据集到多核
  5. 同步原语Arc/Mutex 共享数据,channel 跨线程通信

常见误区#

  1. 混淆并发与并行:并发是编程模式,并行是执行方式
  2. 滥用线程:创建过多线程导致调度开销(异步更高效)
  3. 阻塞异步运行时:在异步任务中调用阻塞函数(如 std::net
  4. 误用共享状态:未用 Mutex 导致数据竞争
  5. 忽略生命周期:跨线程传递引用需 'static 或 Arc

应用场景#

场景解决方案优势
CPU密集型计算rayon 并行迭代器自动利用多核,接近线性加速
高并发网络服务Tokio 异步运行时单线程处理数千连接,低内存占用
实时数据处理管道线程池 + 跨线程通道解耦生产/消费,控制任务优先级
GUI事件循环async + 事件驱动(如 winit避免阻塞UI线程
批量I/O操作tokio::fs 异步文件操作等待磁盘时释放线程执行其他任务

关联知识#

  1. Future 系统:异步核心 trait,表示延迟计算
  2. Pin 与 Unpin:固定内存地址支持自引用结构
  3. 执行器(Executor):调度和运行 Future(如 Tokio)
  4. 反应器(Reactor):I/O 事件通知系统(如 mio
  5. 工作窃取调度:运行时优化负载均衡(Tokio 默认)
  6. 原子操作AtomicBool/AtomicUsize 实现无锁并发
  7. 线程局部存储thread_local! 实现线程私有数据

💡 黄金法则: CPU密集型 → 并行(rayon) I/O密集型 → 异步(tokio/async-std) 简单隔离任务 → 线程(std::thread) 始终用 RUST_LOG=info 监控运行时行为!

并发、并行、异步
https://website-truelovings-projects.vercel.app/posts/rust/并发-并行-异步/
作者
欢迎来到StarSky的网站!
发布于
2025-08-15
许可协议
CC BY-NC-SA 4.0