Rayon 用于 Rust:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 Rayon,为什么需要它?



Rayon 是一个强大的 Rust 编程语言库,它提供了一种简单且安全的方式来实现计算的并行化。其主要特点是 并行迭代器 的概念。您无需手动管理线程、互斥锁和通道,只需将顺序迭代器(`.iter()`)替换为并行迭代器(`.par_iter()`),Rayon 就会自动将工作分配到所有可用的 CPU 核心上。



为什么需要这个库?在现代世界中,多核处理器已成为标准。然而,手动编写多线程代码是一项复杂的任务,容易导致数据竞争、死锁和其他难以发现的错误。Rayon 承担了所有这些复杂性,提供了:

  • 自动工作分配: 库本身决定如何将数据分割成块并在线程之间分配。
  • 类型安全: 得益于 Rust 的所有权和借用系统,Rayon 在编译阶段保证了没有数据竞争。
  • 工作窃取: 如果一个线程提前完成了任务,它会从忙碌的线程“窃取”工作,确保所有核心的负载均衡。
  • 易于使用: Rayon 的 API 对于任何熟悉 Rust 迭代器的开发者来说都直观易懂。


Rayon 非常适合需要处理大量数据的任务:图像处理、模拟、数值计算、文件解析等等。如果您的任务可以轻松分解为独立的子任务(数据并行),那么 Rayon 就是您的选择。



安装



Rayon 通过 Rust 的标准方式安装——使用 Cargo 包管理器。将以下行添加到您项目的 Cargo.toml 文件中:



[dependencies]rayon = "1.10"


之后,运行命令 cargo build,Cargo 将自动下载并编译该库。Rayon 是一个“纯” Rust 库,因此不需要额外的依赖项或系统要求。它可以在 Windows、macOS 和 Linux 上运行。



快速入门



让我们从一个经典示例开始:对一个大数组中的数字求和。首先,我们顺序执行,然后使用 Rayon 并行执行。



// 引入库use rayon::prelude::*;

fn main() { // 创建一个大的数字向量 let numbers: Vec<u64> = (1..=10_000_000).collect();

// --- 顺序求和 --- let sequential_start = std::time::Instant::now(); let sum_sequential: u64 = numbers.iter().sum(); let sequential_duration = sequential_start.elapsed(); println!("顺序求和结果: {} (耗时: {:?})", sum_sequential, sequential_duration);

// --- 使用 Rayon 并行求和 --- let parallel_start = std::time::Instant::now(); let sum_parallel: u64 = numbers.par_iter().sum(); // 将 .iter() 替换为 .par_iter() let parallel_duration = parallel_start.elapsed(); println!("并行求和结果: {} (耗时: {:?})", sum_parallel, parallel_duration);

// 比较加速比 println!("加速比: {:.2}x", sequential_duration.as_secs_f64() / parallel_duration.as_secs_f64());}


在这个例子中,我们只做了一个改动:将 .iter() 替换为 .par_iter()。Rayon 自动将向量分割成块,分配到各个线程,计算部分和,然后合并结果。在多核处理器上,您会看到显著的加速。



主要方法/函数



1. par_iter()

功能: 从集合元素的引用创建并行迭代器。这是最常

推荐