#[tokio::main]是tokio Runtime简化的异步运行时创建方式,举个例子:
使用原生的runtime运行
use tokio::time::{sleep, Duration};
use tokio::runtime::Runtime;
fn main() {
// 使用 Runtime::new() 来创建并运行异步任务
let rt = Runtime::new().unwrap();
rt.block_on(async { async_task().await });
}
async fn async_task() {
println!("start async task");
sleep(Duration::from_secs(1)).await;
println!("end async task");
}
上面调用了runtime的block_on()方法,block_on要求一个Future作为参数,可以像上面一样直接使用一个async {}来定义一个Future。每一个Future都是一个已经定义好但尚未执行的异步任务,每一个异步任务中可能会包含其它子任务。
这些异步任务不会直接执行,需要先将它们放入到runtime环境,然后在合适的地方通过Future的await来执行它们。await可以将已经定义好的异步任务立即加入到runtime的任务队列中等待调度执行,于此同时,await会等待该异步任务完成才返回。
使用#[tokio::main]运行
use tokio::time::{sleep, Duration};
use tokio::runtime::Runtime;
#[tokio::main]
async fn main() {
async_task().await;
}
async fn async_task() {
println!("start async task");
sleep(Duration::from_secs(1)).await;
println!("end async task");
}
上面两段代码是等价