cargo new rayon-example在Rust项目中使用Rayon之前,需要将其添加到Cargo.toml文件中:
[dependencies] rayon = "1.5.1"
这将告诉Cargo从官方Rust包注册仓库下载并安装Rayon。
use rayon::prelude::*; fn main() { let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let sum: i32 = numbers.par_iter().sum(); println!("Sum: {}", sum); }在这个例子中,我们创建了一个数字向量,然后使用Rayon的par_iter方法在这个向量上创建一个并行迭代器。然后调用迭代器上的sum方法,将vector中所有的数字相加。结果是向量中所有数字的和。
use std::sync::atomic::{AtomicI32, Ordering}; fn main() { // 堆代码 duidaima.com let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let sum = AtomicI32::new(0); rayon::scope(|s| { for chunk in numbers.chunks(2) { s.spawn(|_| { let chunk_sum: i32 = chunk.iter().sum(); sum.fetch_add(chunk_sum, Ordering::SeqCst); }); } }); println!("Sum: {}", sum.load(Ordering::SeqCst)); }在这个例子中,我们使用Rayon的scope方法为闭包内的代码块创建一个新的线程池。在闭包内部,我们将vector拆分为两个元素的块,然后为每个块生成一个新的线程。每个线程将其块中的数字相加,并将结果添加到sum变量中。
fn main() { let numbers: Vec<i32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let (even_sum, odd_sum) = rayon::join( || { numbers .iter() .filter(|&x| x % 2 == 0) .map(|&x| x) .sum::<i32>() }, || { numbers .iter() .filter(|&x| x % 2 != 0) .map(|&x| x) .sum::<i32>() }, ); println!("Even sum: {}", even_sum); println!("Odd sum: {}", odd_sum); }在这个例子中,我们使用Rayon的“join”方法并行执行两个计算:一个是对向量中的偶数求和,另一个是对奇数求和。join方法返回一个包含两个计算结果的元组,然后将其打印到控制台。