38 个版本 (22 个稳定版)
1.10.0 | 2024 年 3 月 24 日 |
---|---|
1.8.1 | 2024 年 1 月 17 日 |
1.8.0 | 2023 年 9 月 20 日 |
1.7.0 | 2023 年 3 月 4 日 |
0.0.1 | 2015 年 12 月 10 日 |
#3 在 并发
5,917,725 每月下载量
在 13,334 个 Crates 中使用 (3,560 直接使用)
1MB
22K SLoC
Rayon
Rayon 是 Rust 的数据并行库。它非常轻量级,可以将顺序计算轻松转换为并行计算。它还保证了数据竞争自由。 (您可能还会喜欢关于 Rayon 的这篇博客文章 Rayon 数据并行化在 Rust 中,它提供了更多关于其工作原理的背景和细节,或者 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的PR中的所有代码都假定在Rayon的双MIT/Apache 2.0许可下发布。
快速演示
要查看Rayon的实际效果,请查看包含使用Rayon的代码的示例的rayon-demo
目录。例如,运行此命令以获取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。提交拉取请求被视为同意这些许可条款。
依赖项
~0.3–1.8MB
~32K SLoC