#并行 #线程 #性能

rayon-progress-bar

为 Rust 提供简单的工作窃取并行性

1 个稳定版本

1.9.0 2024 年 4 月 3 日

#136并发

MIT/Apache

1MB
22K SLoC

Rayon

Rayon crate Rayon documentation minimum rustc 1.63 build status Join the chat at https://gitter.im/rayon-rs/Lobby

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 还提供了 joinscope 函数,这些函数允许您创建自己的并行任务。为了获得更多控制,您还可以创建 自定义线程池 而不是使用 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-APACHELICENSE-MIT。提交拉取请求被视为同意这些许可条款。

依赖关系

~2–10MB
~90K SLoC