首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Rust专项——Tokio异步与async/await实战入门

Rust专项——Tokio异步与async/await实战入门

作者头像
红目香薰
发布2025-12-16 16:22:22
发布2025-12-16 16:22:22
1840
举报
文章被收录于专栏:CSDNToQQCodeCSDNToQQCode

本篇带你体验Rust异步世界,基于Tokio运行时,掌握async/await关键语法,高效IO与高并发的解决之道。

1. 为什么需要异步与Tokio?

  • 传统多线程模型下,IO密集/高并发时可能导致线程爆炸与上下文切换性能损耗。
  • 异步模型(基于future)下,少量线程协作驱动数万~百万IO任务,非常适合网络服务、网关、爬虫、消息队列等。
  • Tokio是最主流的Rust异步生态,生态完整,广泛应用于工业生产环境。

2. async/await 最基本用法

需要添加对应的tokio

代码语言:javascript
复制
[package]
name = "my_library"
version = "0.1.0"
edition = "2021"
[dependencies]
tokio = { version = "1", features = ["full"] }
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
use tokio::time::{sleep, Duration};

#[tokio::main]
async fn main() {
    println!("begin");
    sleep(Duration::from_secs(1)).await;
    println!("end");
}
  • #[tokio::main] 宏会自动启动Tokio运行时,支持 .await 语法。
  • 异步函数返回 impl Future,通过 .await 让出控制权。

3. 并发执行与任务调度

代码语言:javascript
复制
use tokio::time::{sleep, Duration};

#[tokio::main]
async fn main() {
    let h1 = tokio::spawn(async { sleep(Duration::from_millis(700)).await; "A" });
    let h2 = tokio::spawn(async { sleep(Duration::from_millis(300)).await; "B" });
    let v = tokio::try_join!(h1, h2).unwrap();
    println!("Both joined result: {:?}", v);
}
  • tokio::spawn 用于派发任务到线程池。
  • tokio::join! / try_join! 并发等待多个future全部完成。
在这里插入图片描述
在这里插入图片描述

4. Tokio通道与共享状态

代码语言:javascript
复制
use tokio::sync::mpsc;

#[tokio::main]
async fn main() {
    let (tx, mut rx) = mpsc::channel(32);
    tokio::spawn(async move {
        for i in 0..5 {
            tx.send(format!("msg-{i}")).await.unwrap();
        }
    });
    while let Some(msg) = rx.recv().await {
        println!("got {msg}");
    }
}
  • Tokio自带多种并发原语: mpsc/rwlock/mutex/oneshot 等。
  • 与标准库mpsc写法类似,但支持异步 .await
在这里插入图片描述
在这里插入图片描述

5. 定时与延时任务

代码语言:javascript
复制
use tokio::time::{interval, Duration};

#[tokio::main]
async fn main() {
    let mut ticks = interval(Duration::from_secs(1));
    for _ in 0..5 {
        ticks.tick().await;
        println!("tick");
    }
}
在这里插入图片描述
在这里插入图片描述

6. 网络服务案例(最简单TCP echo服务器)

代码语言:javascript
复制
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080").await?;
    loop {
        let (mut socket, _) = listener.accept().await?;
        tokio::spawn(async move {
            let mut buf = [0u8; 1024];
            loop {
                let n = match socket.read(&mut buf).await {
                    Ok(0) => break,
                    Ok(n) => n,
                    Err(_) => break,
                };
                if socket.write_all(&buf[..n]).await.is_err() {
                    break;
                }
            }
        });
    }
}
  • 一个最基础的echo server,自动高并发,主线程完全无阻塞。

7. 常见报错与陷阱

  • 不要在异步主线程中阻塞(不能直接用 std::thread::sleep / std::fs::read 等阻塞接口)。
  • 多线程共享状态需配合tokio::sync::Mutex/Arc 等。
  • 一切IO都要用tokio提供的Async版本,否则会阻塞所有任务!

8. 实战练习

  1. 写一个只打印"你好 async"并等待3秒再退出的 tokio 主程序。
  2. 用tokio mpsc通道实现任务分发和结果收集:主任务派发,worker并发打印消息。
  3. 写一个满足并发多客户端echo的tcp server。

9. 拓展阅读与推荐


下一节可选:深入异步原理、unsafe下自定义Future、业务微服务架构与实践。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 为什么需要异步与Tokio?
  • 2. async/await 最基本用法
  • 3. 并发执行与任务调度
  • 4. Tokio通道与共享状态
  • 5. 定时与延时任务
  • 6. 网络服务案例(最简单TCP echo服务器)
  • 7. 常见报错与陷阱
  • 8. 实战练习
  • 9. 拓展阅读与推荐
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档