INTERACTIVE LAB

rustVIP2 个可运行示例0 次浏览 更新于 2026-09-28

Rust:异步编程

学习 Rust 异步编程的基本概念、状态共享、异步生态与实践注意事项。

一、前言

异步是一个非常强大特性,它有相当多的实现模型,其中比较知名的“协程”,go语言的并发编程就是借助的“协程”这一概念达到了非常高的性能,

不理解协程的可以查看另外一篇文章:协程与线程。

在这众多实现模型中,最基本就是多线程模型了,由于其是系统本身底层提供的,所以写起来、理解起来都会较为简单。

还有就是事件驱动模型,和windows消息机制差不多,不理解的可以参考:windows编程入门。

除了上面三个之外,另一个常用的异步模型便是async/await。

它的主要麻烦之处在于其底层实现非常复杂,但好在这并不需要我们自己去实现。直接使用即可。

第二个麻烦之处在于其不好理解,这便是本章要做的事情了。

由于rust语言本身提供了await、async以及Future这三个async/await模型最基础的特性,所以使得实现该模型变得更加容易。

rust中异步库有很多,但目前性能最好、效率最高、最流行的库是一个叫tokio的。

从一张网上流传甚广、据说是官方测试各种异步框架效率也能看出tokio的恐怖之处:

image-20240203085743982

该图展示的大概是各种异步框架所实现的最小http服务器单位时间所能处理的请求数量。

所以本章也将直接以tokio为例对rust中异步的使用进行介绍。

二、基本理解与使用

首先你需要下载tokio,在配置文件中添加下面这行代码:

tokio = { version = "1.36.0", features = ["full"] }

它的基本使用方法如下:

rust
待运行⌘↵
fn main() {
    let rt = tokio::runtime::Runtime::new().unwrap();
    rt.block_on(async {
        println!("hello tokio");
    })
}
src/main.rs

看起来似乎很复杂,这里对其简单解析一下:

  1. 首先我们需要创建一个tokio的“运行时”,也就是上面的rt变量,它将成为整个程序的异步基础。
  2. 然后使用其上的block_on函数就可以去调用异步代码块,比如这里的async{}就是一个异步运行的代码块。
  3. 此时main函数会始终阻塞在block_on函数内,直到传入的函数、代码块被全部执行结束,才会结束调用。

你可能会觉得这看上去也没什么呀?似乎就是等一段代码结束而已。

但事实上tokio创建的这个运行时内部在这一过程中是做了相当多事情的,这里简单说一下它可能的工作原理:

  1. “运行时”创建的同时,其内部会管理一个类似“线程池”一样的东西,被称为“执行器”,不理解的可以参考文章:手写一个线程池。
该实验为 VIP 专享内容,
请开通后继续阅读后续 70% 并运行完整示例~