Rayon - 数据并行计算库

Rayon 是一个用于 Rust 实现的轻量级数据并行化库。使用 Rayon 可以很容易地将顺序计算转换为并行计算,并保证数据竞争的自由。

并行迭代器

要使用并行迭代器,首先通过在模块中添加 use rayon::prelude::* 来导入特征。然后只需将 .iter() 及类似的调用改为 .par_iter().par_iter_mut().into_par_iter 来获取并行迭代器。并行迭代器和常规迭代器一样,它的工作方式是先构造一个计算,然后执行。

use rayon::prelude::*;
fn sum_of_squares(input: &[i32]) -> i32 {
    input.par_iter() // <-- just change that!
         .map(|&i| i * i)
         .sum()
}

并行迭代器自行决定如何将数据划分为任务;它将动态地调整以实现性能的最优化。如果应用程序需要更好的灵活性,Rayon 还提供了 joinscope 函数,允许应用程序创建并行任务。

参见
join : https://docs.rs/rayon/1.7.0/rayon/fn.join.html
scope : https://docs.rs/rayon/1.7.0/rayon/fn.scope.html

自定义线程池

Rayon 默认使用 Rayon 的全局线程池。为了获得更多的控制权,应用程序可以创建自定义线程池。

fn main() -> Result<(), rayon::ThreadPoolBuildError> {
    let pool = rayon::ThreadPoolBuilder::new()
        .num_threads(256)
        .build()
        .unwrap();
    pool.install(|| println!("Hello from my custom thread!"));
    Ok(())
}