【tokio】异步编程

本文深入探讨了同步编程与异步编程的区别,重点介绍了Rust中的异步编程概念。通过示例展示了如何使用async和await关键字进行异步操作,并解释了异步函数的惰性执行特性以及需要运行时支持的事实。同时,提到了异步main函数的转换和其背后的运行时初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同步编程和异步编程的区别

同步编程:按程序编写的顺序执行,如果操作不能立即获得执行结果,会一直阻塞直到获取到结果。

异步编程:如果操作不能立即获得执行结果,操作会挂起到后台,执行线程不阻塞,继续执行其他操作任务。一旦操作完成,操作恢复,从中断的地方继续执行。

Rust异步编程

rust异步编程使用async和await关键字。

async:标识函数为异步, async标识的函数会编译成异步执行例程。

await:对返回值执行await时,才执行异步操作。这里的返回值是指调用异步函数的返回值,该返回值标识这个异步操作。

例子

async fn say_world() {
    println!("world");
}

#[tokio::main]
async fn main() {
    // Calling `say_world()` does not execute the body of `say_world()`.
    let op = say_world();

    // This println! comes first
    println!("hello");

    // Calling `.await` on `op` starts executing `say_world`.
    op.await;
}

输出

hello
world

有3点需要重点理解

  1. 调用异步函数不会返回异步函数的执行结果,而是返回一个值代表这个异步函数。如上面例子op代表的就是async fn say_world()。
  2. rust异步是惰性的,并不是在调用的时候执行,是在返回值调用.await时才执行,上面例子的输出也证实了这点。
  3. 异步函数必须由运行时执行。运行时包含异步任务调度程序,提供事件I/O、计时器等。运行时不会自动启动,因此主函数需要启动它。下面会提到。

异步main函数

#[tokio::main]
async fn main() {
    println!("hello");
}

相比正常main函数有2点不同:

  1. 增加了async
  2. 增加了注释 #[tokio::main]

#[tokio::main]

这是一个注释宏,会将异步main函数转换为同步main函数,初始化运行时,并执行异步main函数。

#[tokio::main]
async fn main() {
    println!("hello");
}

转化为

fn main() {
    let mut rt = tokio::runtime::Runtime::new().unwrap();
    rt.block_on(async {
        println!("hello");
    })
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值