Rust异步编程
Async Rustasync/await • Future • Stream • PinTasks: 3 Active

异步编程 #

异步编程通常与并行、并发相结合,是一种处理并发的流行技术。从很多方面来看,异步编程只是语法糖,将复杂性隐藏在抽象背后。

异步编程使用并发来利用任务之间的空闲处理时间。某些类型的任务(如I/O)比普通CPU指令慢得多,在启动慢速任务后,可以将其放在一边,等待慢速任务完成,同时处理其他任务。

Runtime(运行时) #

Rust语言本身不提供异步运行时的实现。Rust仅仅提供了Future trait、async关键字和.await语句,实现细节主要留给第三方库。

Rust有三种广泛使用的异步运行时:

  • tokio: 功能齐全的异步运行时
  • async-std: 模拟Rust标准库接口,它提供了我们所习惯的标准库接口,但以异步版本呈现,并为Rust的async/await语法做好了准备
  • smol: 一个轻量级的运行时

tokio是目前最成熟和使用最广泛的运行时。

同步I/O与异步I/O的区别 #

同步 I/O异步 I/OThread 1I/O task 1ProcessingThread 2I/O task 2ProcessingThread 3I/O task 3ProcessingThread 1I/O task 1I/O task 2I/O task 3ProcessingProcessingProcessing
  • 同步I/O: 发起 I/O 请求后,调用者必须等待 I/O 操作完成才能继续执行后续操作。就像图中的“同步 I/O”部分,每个线程(Thread 1、Thread 2、Thread 3)在执行 I/O 任务(I/O task 1、I/O task 2、I/O task 3 等)时,都必须等待该任务完成后才能进行“Processing”或其他后续的 I/O 任务。
  • 异步I/O: 发起 I/O 请求后,调用者可以立即返回并执行其他操作,无需等待 I/O 操作完成。I/O 操作在后台进行,完成后会以某种方式通知调用者。如图中的“异步 I/O”部分,Thread 1 发起多个 I/O 任务(I/O task 1、I/O task 2、I/O task 3)后,无需等待它们完成就可以进行“Processing”,之后再处理已完成的 I/O 任务的结果。

举例:

  • 同步I/O:去餐厅点餐,必须在柜台等待食物做好才能离开。期间你什么都不能做,只能等。这就像线程在等待I/O完成。
  • 异步I/O:在网上订外卖,下单后就可以去做其他事情(看电视、工作等),等外卖送到后再接收。这就像线程发起I/O请求后继续执行其他任务,等I/O完成的通知。

异步编程的一个重要规则是永远不要阻塞主线程。

tokio #

© 2025 青蛙小白 | 总访问量 | 总访客数