Rust

2025年11月03日更新 13 人订阅
原价: ¥ 6 限时优惠
专栏简介

Rust 异步编程基石:Tokio 运行时从入门到精通(单线程与多线程实战)

Rust异步编程基石:Tokio运行时从入门到精通(单线程与多线程实战)随着高并发、高性能网络服务的需求日益增长,异步编程已成为现代系统开发不可或缺的一环。在Rust语言的生态中,Tokio扮演着异步运行时的核心角色。它不仅提供了高效的I/O和任务调度机制,还为构建健壮、可伸缩的网络

Rust 异步编程基石:Tokio 运行时从入门到精通(单线程与多线程实战)

随着高并发、高性能网络服务的需求日益增长,异步编程已成为现代系统开发不可或缺的一环。在 Rust 语言的生态中,Tokio 扮演着异步运行时的核心角色。它不仅提供了高效的 I/O 和任务调度机制,还为构建健壮、可伸缩的网络应用奠定了基础。本文将通过详尽的代码示例,带您从零开始,掌握 Tokio 运行时的创建、配置,以及在单线程和多线程模式下的实际应用,助您迈出 Rust 异步编程的关键一步。

Rust Async Tokio 简介

Tokio

Rust编程语言的一个异步运行时,但并不是唯一的。

  • 提供了编写网络应用程序所需的构建块。它具有灵活性,可以针对各种系统,从拥有数十个内核的大型服务器到小型嵌入式设备。
  • 几个主要的组件:一个用于执行异步代码的多线程运行时、标准库的异步版本、一个庞大的库生态系统

Tokio 的主要部分

  • Executor
  • Reactor

异步版本

  • Runtime
  • I/O
  • File System
  • Network
  • Time
  • Process
  • ...

单线程模式

  • block_on(...)
  • #[tokio::main(flavor = "current_thread")]

实操

创建项目

cargo new tokio_intro

cd tokio_intro/

ls

cc # open -a cursor .

➜ cargo add tokio -F full                                                   

示例一

如何在 Rust 中使用 Tokio 手动创建并运行一个异步运行时(Runtime)

use tokio::runtime;

async fn hi() {
    println!("Hello tokio!");
}

fn main() {
    runtime::Builder::new_current_thread()
        .enable_all()
        .build()
        .unwrap()
        .block_on(hi());
}

🔹 详细解释:

  1. use tokio::runtime; 这一行引入了 Tokio 的运行时模块。Tokio 是 Rust 中最常用的异步运行时库,它负责 执行 async 异步任务管理事件循环处理 I/O、定时器等异步操作

  2. async fn hi() 定义了一个异步函数 hi,其返回一个 Future(异步任务),执行时会打印 "Hello tokio!"

    注意:定义 async fn 并不会立刻执行函数体,它只会返回一个 Future 对象,必须由运行时(runtime)来驱动执行。

  3. runtime::Builder::new_current_thread() 这里使用 Tokio 的 Builder 模式 手动创建一个运行时。

    • new_current_thread() 表示创建一个 单线程 的运行时(所有任务都在当前线程中执行)。
    • 相对地,Tokio 还提供 new_multi_thread() 来创建多线程运行时。
  4. .enable_all() 启用 Tokio 提供的所有功能模块,例如:

    • 定时器(tokio::time
    • I/O(tokio::net
    • 信号处理(tokio::signal)等 如果不启用,某些异步功能可能无法使用。
  5. .build().unwrap() 调用 build() 来真正构建运行时,如果创建失败则用 unwrap() 抛出错误(直接 panic)。

  6. .block_on(hi()) block_on() 方法会:

    • 启动运行时;
    • 同步阻塞当前线程;
    • 直到传入的异步任务 hi() 执行完毕后才返回。 简而言之,这一步是 在同步上下文中运行异步函数

🔹 执行流程总结:

  1. 程序启动 → 进入 main()
  2. 构建一个单线程 Tokio 运行时;
  3. 使用运行时的 block_on 方法执行异步函数 hi()
  4. 异步函数 hi() 打印 "Hello tokio!"
  5. 程序结束。

🔹 程序输出:

Hello tokio!

🔹 补充说明:

这种写法常用于:

  • 非异步的主函数中(例如普通 fn main())调用异步函数;
  • 手动控制 Tokio 运行时(例如在嵌入式系统或需要精确控制线程数的环境中)。

若使用常规的 Tokio 宏方式,也可以简化为:

#[tokio::main]
async fn main() {
    hi().await;
}

它与上述代码逻辑完全等价,只是用宏自动帮你创建了运行时。

运行

➜ cargo run
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/tokio_intro`
Hello tokio!

这段运行结果表示:Rust 项目已经成功编译并执行,程序输出了预期的内容。 具体来说:cargo run 会先编译当前项目(如果代码未变化,则直接使用已有构建结果),然后运行生成的可执行文件。在输出中,Finished 'dev' profile 表示编译完成,Running 'target/debug/tokio_intro' 表示正在运行名为 tokio_intro 的程序。随后,程序中的 Tokio 运行时启动并执行异步函数 hi(),最终在控制台打印出 "Hello tokio!",说明异步任务顺利执行并正常结束。

示例二


// use tokio::runtime;

as...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论