闽公网安备 35020302035485号
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方法返回一个包含两个计算结果的元组,然后将其打印到控制台。