1 个稳定版本
1.9.0 | 2024 年 4 月 3 日 |
---|
#136 在 并发
1MB
22K SLoC
Rayon
Rayon 是一个 Rust 的数据并行库。它非常轻量级,可以将顺序计算轻松转换为并行计算。它还保证了数据竞争自由。(您还可以欣赏有关 Rayon 的这篇博客文章,它提供了更多关于其工作原理的背景和细节,或者观看 Rust Belt Rust 大会上的这个视频。)Rayon 可在 crates.io 上使用,且 API 文档 可在 docs.rs 上找到。
并行迭代器和更多
Rayon 可以轻松地将顺序迭代器转换为并行迭代器:通常,您只需将您的 foo.iter()
调用更改为 foo.par_iter()
,Rayon 会完成剩余的工作
use rayon::prelude::*;
fn sum_of_squares(input: &[i32]) -> i32 {
input.par_iter() // <-- just change that!
.map(|&i| i * i)
.sum()
}
并行迭代器 会负责决定如何将数据划分为任务;它会动态适应以获得最佳性能。如果您需要比这更多的灵活性,Rayon 还提供了 join 和 scope 函数,这些函数允许您创建自己的并行任务。为了获得更多控制,您还可以创建 自定义线程池 而不是使用 Rayon 的默认全局线程池。
无数据竞争
您可能听说过并行执行可能会产生各种疯狂的错误。但请放心。Rayon 的所有 API 都保证了 数据竞争自由,这通常排除了大多数并行错误(尽管不是所有)。换句话说,如果您的代码能够编译,它通常与之前的行为相同。
大多数情况下,特别是并行迭代器可以保证其结果与顺序迭代器相同。但有一个注意事项:如果你的迭代器有副作用(例如,通过 Rust 通道 向其他线程发送方法或写入磁盘),这些副作用可能以不同的顺序发生。另外,在某些情况下,并行迭代器提供了比顺序迭代器方法更高效的替代版本。
使用 Rayon
Rayon 可在 crates.io 上找到。推荐的使用方法是向你的 Cargo.toml 文件中添加一行,例如:
[dependencies]
rayon = "1.8"
要使用并行迭代器 API,需要将一些特质引入作用域。最简单的方法是使用 Rayon 预言。在你想使用并行迭代器 API 的每个模块中,只需添加:
use rayon::prelude::*;
Rayon 当前需要 rustc 1.63.0
或更高版本。
与 WebAssembly 一起使用
默认情况下,当构建 WebAssembly 时,Rayon 会将其视为任何其他不支持多线程的平台,并回退到顺序迭代。这允许现有代码无需修改即可成功编译和运行,但运行速度较慢,因为它只会使用单个 CPU 核心。
你可以构建为 Web 适当的多线程支持的 Rayon 项目,但你需要一个适配器和一些项目配置来处理 WebAssembly 线程与其他平台线程之间的差异。
有关更多详细信息,请参阅 wasm-bindgen-rayon 文档。
贡献
Rayon 是一个开源项目!如果你想为 Rayon 做贡献,请查看 “需要帮助”问题列表。这些都是(或应该是)适合入门的问题,通常包括详细的操作说明。如果有任何不清楚的地方,请提出问题!另外,请查看维基上的 开发指南 页面。请注意,提交给 Rayon 的所有代码都假定 在 Rayon 的双重 MIT/Apache 2.0 许可下发布。
快速演示
要查看 Rayon 的实际应用,请查看 rayon-demo
目录,其中包含一些使用 Rayon 的代码演示。例如,运行此命令以获取 N 体重力模拟的可视化。要查看使用 Rayon 的影响,按 s
以顺序方式运行,按 p
以并行方式运行。
> cd rayon-demo
> cargo run --release -- nbody visualize
有关演示的更多信息,请尝试
> cd rayon-demo
> cargo run --release -- --help
还有其他问题吗?
查看 Rayon 常见问题解答。
许可
Rayon 在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发。有关详细信息,请参阅 LICENSE-APACHE 和 LICENSE-MIT。提交拉取请求被视为同意这些许可条款。
依赖关系
~2–10MB
~90K SLoC