【问题标题】:Rust: how to perform heavy amount of concurrency in a loop?Rust:如何在循环中执行大量并发?
【发布时间】:2021-12-03 16:04:57
【问题描述】:

假设我有这样的计算:

async fn sum_2(x: &f64) -> f64 {
   x + 2
}

fn main() {
   let mut x = vec![
      vec![1.0, 2.0, 3.0],
      vec![2.0, 3.0, 4.0],
   ];

   for i in 0..2 {
      for j in 0..3 {
         x[i][j] = sum_2(x[i][j]).await;
      }
   }
}

同时执行此操作的正确/更好方法是什么? 我知道join!(),当呼叫已知时,这非常好。 我也知道thread::spawn(),但我不知道这是否是实现这一目标的正确工具,也不知道如何实现。 Rust 中难道没有像线程池这样的东西,我可以将所有函数调用发送到然后执行吗?谢谢!

【问题讨论】:

  • 看看人造丝箱
  • 能否请您为上面的代码举一个例子或指导我做类似的事情?我发现的所有示例对我来说都很难理解或有点不同,因为我想更新适当的值。

标签: rust concurrency


【解决方案1】:

您似乎在寻找futures::future::join_all

来自官方的例子:

use futures::future::join_all;
async fn foo(i: u32) -> u32 { i }
let futures = vec![foo(1), foo(2), foo(3)];
assert_eq!(join_all(futures).await, [1, 2, 3]);

【讨论】:

  • 此答案是对 OP 的字面回答,并假设您拥有的期货比 OP 的示例更复杂一些。如果重点是同时处理一个数组/矩阵,rayon 可能比n*m 期货更有效。
  • 感谢您的回答@mcarton。是的,这个想法是运行一个 n*m 矩阵并更新值。更准确地说,我正在尝试为一个线性方程组编写一个求解器,以便同时迭代更新。这就是为什么我希望在适当的位置更新这些值。
  • 那我建议你看rayon,它更适合数据并行,而async/await更适合I/O并发。
猜你喜欢
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多