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
相关产品推荐
相关产品推荐

