异步编程-Rust

异步编程-Rust
XIU简单入门
概念
异步编程与多线程一样也是一种为了提高程序运行效率设计的一种编程模式,区别在于多线程是利用cpu资源提升效率,而异步是为了避免IO等待时间的资源浪费,比如某个app更新的时候锁定页面我们无法做任何操作,这个时候可以借助异步编程来实现后台下载更新,我们仍然可以使用该app的其他功能
- 异步编程的核心原理
非阻塞 I/O:异步操作将 I/O 请求提交后立即返回,线程不等待结果,而是通过回调、事件循环或 async/await 机制在操作完成后恢复执行。
单线程并发:异步编程通常基于单线程事件循环,通过任务调度实现高并发,而非依赖多线程。
- 多线程的适用场景与限制
优势:直接利用多核 CPU 并行计算(如视频渲染)。
劣势:线程创建和切换成本高(上下文切换耗时数微秒)。线程间共享资源需同步(如锁、信号量),易引发死锁或竞争条件。
1 | fn get_two_sites() { |
async/.await
Rust 内置的语言特性,可以让我们用同步的方式去编写异步的代码。
通过 async 标记的语法块会被转换成实现了Future特征的状态机。 与同步调用阻塞当前线程不同,当Future执行并遇到阻塞时,它会让出当前线程的控制权,这样其它的Future就可以在该线程中运行,这种方式完全不会导致当前线程的阻塞。
1 | use futures::executor::block_on; |
在一个async fn函数中去调用另一个async fn并等待其完成后再执行后续的代码
1 | // 引入 futures 库的阻塞执行器 block_on,用于在同步上下文中运行异步任务 |
每个 async 函数在 Rust 中返回一个 Future 对象,该 Future 必须通过执行器(如 block_on)或异步环境中的 await 驱动才能执行
1 | // 使用 block_on(同步环境) |
Future 特征
异步函数的返回值和被执行的关键,它是一个能产出值的异步计算,需要被执行器poll(轮询)后才能运行
1 | trait SimpleFuture { |
1、Future 需要被执行器poll(轮询)后才能运行
2、Future 并不能保证在一次 poll 中就被执行完
3、Future可以被完成,会返回 Poll::Ready(result) ,反之则返回 Poll::Pending并且安排一个 wake 函数
4、当未来 Future 准备好进一步执行时, wake 函数会被调用




