微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将线程迭代器收集到向量中启动线程

以下代码显示将迭代器映射到线程并收集到 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 通道,可能是有界的),无论您从队列中喂食多少工作人员,都生成它,将您的所有工作推送到队列中,然后以某种方式收集结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。