澄清 rust rayon 嵌套线程池工作线程编号

Clarify rust rayon nested thread pool worker numbers

提问人:ElevenLee 提问时间:8/17/2023 更新时间:8/17/2023 访问量:74

问:

我尝试以嵌套方式使用并行迭代器。由于全局池具有固定数量的线程,因此我倾向于在外池生成的线程中各创建一个池和一个池。rayonmain

use rayon::prelude::*;

fn stress(index: u32) {
    println!("Runner {} started.", index);
    let mut _x = 0;
    loop {
        _x += 1;
        _x -= 1;
    }
}

fn sub(outer: u32) {
    let inner_pool = rayon::ThreadPoolBuilder::new().num_threads(1 as usize).build().unwrap();
    inner_pool.install(|| {
        vec![1, 2, 3, 4].into_par_iter().map(|inner| stress(outer * 10 + inner)).collect()
    })
}

fn main() {
    let outer_pool = rayon::ThreadPoolBuilder::new().num_threads(1 as usize).build().unwrap();
    outer_pool.install(|| vec![1, 2, 3, 4].into_par_iter().map(|outer| sub(outer)).collect())
}

正如代码所示,我有 16 个作业,这些作业被拆分为一个 4x4 组来运行,并且将创建一个外部池和一个内部池,两者都只包含 1 个线程。所以我所期望的只有 1 个作业会运行,并且只会打印一行(可能)。但是我有 3 个作业并行运行,并打印了三行(和 )。stressRunner 11 started.113141

我知道人造丝倾向于将工作减少一半,所以我理解为什么而不是应该在之后出现,但我无法弄清楚为什么多个工作可以在字面上的 1x1 池中并行运行。312111

此外,我还尝试了不同的池大小,但结果仍然让我感到困惑。

负荷
1 1 3
1 2 6
1 3 9
1 4 12
1 16 12
2 1 4
2 2 8
2 3 12
2 4 16
3 1 4
3 2 8
3 3 12
3 4 16

谁能告诉我?

多线程防 行处理 人造丝

评论

1赞 cafce25 8/17/2023
nit:你的循环是一种有趣的写作方式loop {}

答: 暂无答案