【发布时间】:2021-11-04 03:06:55
【问题描述】:
我有以下async函数(实现不重要):
async fn long_task(task_number: i32) {
// do some long work
println!("Task {} executed", task_number);
}
我想同时运行这个函数n次,所以我定义了这个函数:
async fn execute_long_tasks_async(n: i32) {
let mut futures = Vec::new();
for i in 1..=n {
futures.push(long_task(i));
}
futures::future::join_all(futures).await;
}
我正在使用join_all 函数等待所有任务执行完毕。然后我在main 中调用这个函数:
fn main() {
futures::executor::block_on(execute_long_tasks_async(3));
}
我的问题是任务是按顺序运行的:
Executing task 1
Task 1 executed
Executing task 2
Task 2 executed
Executing task 3
Task 3 executed
但我希望它同时运行,我会得到类似的东西:
Executing task 1
Executing task 3
Executing task 2
Task 1 executed
Task 3 executed
Task 2 executed
是否有替代futures::future::join_all 来并行运行所有任务?
我想使用await 创建一个简单的示例来演示async 和await。
【问题讨论】:
-
“我有以下异步函数(实现不重要):” - 实现很重要。 AFAIK,
block_on使用单线程执行。 Future 一直运行,直到它在某个.await上被阻止或直到它到达终点。如果您的async fn中没有.await-s,则它永远不会产生,并且在完成之前不允许其他期货执行。
标签: asynchronous rust async-await