【问题标题】:Collecting an iterator of threads into a vector start the threads将线程的迭代器收集到向量中启动线程
【发布时间】:2021-06-10 14:30:49
【问题描述】:

下面的 sn-p 显示了将迭代器映射到线程并收集到 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(&amp;lines)) -> || thread::spawn(move || count_letters(&amp;lines)),这会是 rust 风格吗?

【问题讨论】:

    标签: multithreading rust iterator


    【解决方案1】:

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

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

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

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

    这会是 rust 风格吗?

    rust 样式可能会使用rayon

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

    【讨论】:

    • 这不是我的代码,我只是想验证我的怀疑,因为编写代码要解决的问题需要限制工作线程的数量。我确实在我的版本中使用了队列。这是一个练习题,所以我会说 rayon 不鼓励
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多