我可以进行翻译。以下是需要翻译的内容:
我有一个 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
。
block_on
使用单个线程执行。Future运行直到它被阻塞在某些.await
上或者直到它到达结尾。如果在您的async fn
中没有.await
,它将永远不会产生,并且在完成之前不允许其他future执行。 - justinas