- 代码示例:
use tokio;
#[tokio::main]
async fn main() {
let task = tokio::spawn(async {
println!("异步任务开始执行");
// 模拟一些异步操作
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
println!("异步任务执行结束");
});
println!("主线程在异步任务执行时继续执行");
// 等待异步任务完成
if let Ok(result) = task.await {
// 如果任务正常完成,这里可以处理返回值,这里没有返回值所以不处理
println!("异步任务成功完成");
} else {
println!("异步任务出现错误");
}
}
-
tokio::spawn
的作用:
tokio::spawn
用于在Tokio运行时中创建一个新的异步任务。它接受一个实现了Future
trait的异步块,并将其作为一个新的任务调度到Tokio运行时的线程池中执行。这样,主线程在调用tokio::spawn
后可以继续执行,而新创建的异步任务会在后台异步运行。例如在上述代码中tokio::spawn(async {... })
就创建了一个新的异步任务,这个任务会在后台开始执行println!("异步任务开始执行");
等操作。
-
await
的作用:
await
关键字用于暂停当前异步函数的执行,直到被等待的Future
完成。它只能在async
函数内部使用。在上述代码中,tokio::time::sleep(std::time::Duration::from_secs(2)).await;
这行代码中,await
使得当前异步任务暂停执行2秒,等待sleep
这个Future
完成(也就是时间过去2秒)。当Future
完成后,await
表达式会返回Future
的结果(如果有),异步函数会从暂停的地方继续执行。同时,在if let Ok(result) = task.await {... }
这里,await
等待异步任务task
完成,并获取其结果,根据结果判断任务是否成功执行。