将线程迭代器收集到向量中启动线程

问题描述

以下代码显示将迭代器映射到线程并收集到 Vec

let workers = input
        .chunks(chunk_size)
        .map(|chunk| {
            let lines = chunk.iter().map(|s| s.to_string()).collect::<Vec<_>>();
            thread::spawn(move || count_letters(&lines))
        })
        .collect::<Vec<_>>(); 

这不会启动所有线程运行(直到创建它们的操作系统)?换句话说,除了 input 的长度外,创建的线程数量没有实际限制。

假设这是真的,如果想在不实例化 collect 上的所有线程的情况下执行此模式,可能会使用另一个闭包,即 thread::spawn(move || count_letters(&lines)) -> || thread::spawn(move || count_letters(&lines)),这会是铁锈风格?

解决方法

这不会启动所有线程运行(直到创建它们的操作系统)?

是的。从技术上讲,这里甚至不需要 collectfor 就可以。

假设这是真的,如果想在收集时不实例化所有线程的情况下执行此模式,可能会使用另一个闭包

但是……为什么要为 spawn 或两个闭包烦恼呢?你可以把它放在你调用外部闭包的地方。

这会是铁锈风格吗?

rust 风格可能是使用 rayon

如果您想手动执行此操作,则通常:创建一个队列(某种类型的 mpmc 通道,可能是有界的),无论您从队列中喂食多少工作人员,都生成它,将您的所有工作推送到队列中,然后以某种方式收集结果。