Rust in Everything
基于 rayon 1.12.0

全景

这一部分先回答「rayon 是什么、什么时候该用、什么时候不该用」,再把三条主线各从头到尾走一遍。三条主线的每一步只画到「调用了哪个函数、读写了哪个原子变量或队列」,细节留给后面的部分,每一步都链过去。

  1. rayon 解决什么问题:数据并行、fork-join、工作窃取;和 std::thread::scope、tokio、crossbeam 的分工;两层 crate;前几卷里谁在用;不适合的场景。
  2. 一次 join:B 被推进本地 deque、本线程跑 A;B 被自己弹回来或被别的线程偷走两种分支;SpinLatch 什么时候需要唤醒。
  3. 一次 par_iter:(0..n).into_par_iter().sum() 怎样变成 bridge_producer_consumer 的递归,切分树有多少片叶子,为什么从 main 调和在池里调切得不一样。
  4. 一个线程睡下又醒来:active → idle → sleepy → sleeping 四个阶段,latch 的 UNSET / SLEEPY / SLEEPING / SET,发布任务的一方怎样决定叫醒谁。
flowchart LR
  why[rayon 解决什么问题] --> join["一次 join:rayon-core"]
  why --> pi["一次 par_iter:rayon"]
  pi -->|"每切一刀就是一次 join_context"| join
  join -->|"等 B 时找不到活"| sleep["睡下又醒来:sleep 模块"]

三条主线是串起来的:par_iter 的每一次切分都是一次 join_context;join 等 B 的时候如果找不到别的活,就进入 sleep 模块的那套流程。

💬 关联讨论

发起讨论
加载中...