如何在 Rust 中等待异步函数调用列表?

Sam*_*nan 23 concurrency rust async-await

async我有一个要同时执行的函数列表,然后等待所有函数完成。我现在的工作代码是:

async fn start_consumers(&self) {
    for consumer in &self.consumers {
        consumer.consume().await;
    }
}
Run Code Online (Sandbox Code Playgroud)

这不太准确,因为函数是串行执行的。我正在寻找类似join!, 但适用于动态向量的东西。这样我应该能够写出类似的东西:

async fn start_consumers(&self) {
    let mut v = Vec::new();
    for consumer in &self.consumers {
        consumer.consume();
    }
    join!(v);
}
Run Code Online (Sandbox Code Playgroud)

目前join!仅支持元组。我正在寻找替代方案。类似于Promise.all()JavaScript 中的东西。

Sam*_*nan 15

futures箱具有join_all允许等待 future 集合的功能:

use futures::future::join_all;

async fn start_consumers(&self) {
    let mut v = Vec::new();
    for consumer in &self.consumers {
        v.push(consumer.consume());
    }
    join_all(v).await;
 }
Run Code Online (Sandbox Code Playgroud)


WBu*_*uck 6

我在同一天也问了类似的问题,但就我而言,我有一个Result包裹在Future. 所以join_all我不得不使用try_join_all