You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何合并动态数量的Future?

处理动态数量Future的方法

当然有办法合并编译时数量未知的多个Future,Rust异步生态里最常用的方案是使用join_all工具,主要有两个来源:

1. 使用futures crate的join_all

首先需要在你的Cargo.toml中添加依赖:

[dependencies]
futures = "0.3"

接下来就可以用join_all接收一个Future的向量,并发执行所有任务,等全部完成后返回对应结果的向量(结果顺序和输入Future的顺序一致):

use futures::future::join_all;

// 示例异步任务
async fn compute(n: usize) -> usize {
    n * 3
}

#[tokio::main] // 也可以使用async-std等其他异步runtime
async fn main() {
    // 动态生成若干异步任务
    let tasks = vec![compute(1), compute(2), compute(3), compute(4)];
    
    // 并发执行并等待所有任务完成
    let results = join_all(tasks).await;
    
    // 验证结果顺序和输入一致
    assert_eq!(results, vec![3, 6, 9, 12]);
}

2. 使用Tokio runtime自带的join_all

如果你项目用的是Tokio异步 runtime,无需额外引入futures crate,Tokio本身提供了同名的tokio::join_all,用法几乎一致:

use tokio::join_all;

async fn compute(n: usize) -> usize {
    n * 3
}

#[tokio::main]
async fn main() {
    let tasks = vec![compute(1), compute(2), compute(3)];
    let results = join_all(tasks).await;
    assert_eq!(results, vec![3, 6, 9]);
}

注意点

  • join_all会并发执行所有传入的Future,且会等待所有任务完成才返回结果,哪怕其中某个任务先完成,也会等剩下的任务结束。
  • 和标准库的join!宏不同:join!针对编译时固定数量的Future,返回元组;join_all针对动态数量的Future,返回向量,刚好互补覆盖两种场景。

内容的提问来源于stack exchange,提问作者Yuchen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:50:33