当前位置: 首页 > article >正文

Rust异步运行时框架tokio保姆级教程

1. 简介

Tokio 是一个用于构建高性能异步应用程序的 Rust 异步运行时框架。它提供了基本的异步 I/O 操作、任务调度、定时器等功能,适合于构建网络服务器、客户端等。

2. 环境准备

Cargo.toml 中添加以下内容:

[dependencies]
tokio = { version = "1", features = ["full"] }

3. 创建一个简单的异步应用

3.1. 基本异步函数

一个简单的异步函数:

use tokio::time::{sleep, Duration};

async fn say_hello() {
    println!("Hello, world!");
    sleep(Duration::from_secs(1)).await;
    println!("Goodbye, world!");
}

3.2. 运行异步任务

使用 Tokio 的运行时来运行异步任务:

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

4. 异步 I/O 示例

下面是一个简单的 TCP 服务器示例,演示如何使用 Tokio 进行异步网络编程。

4.1. 创建 TCP 服务器
use tokio::net::TcpListener;
use tokio::prelude::*;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080").await?;
    println!("Server listening on 127.0.0.1:8080");

    loop {
        let (mut socket, _) = listener.accept().await?;
        tokio::spawn(async move {
            let mut buf = [0; 1024];
            match socket.read(&mut buf).await {
                Ok(0) => return, // 连接已关闭
                Ok(n) => {
                    // 将数据写回客户端
                    if let Err(e) = socket.write_all(&buf[0..n]).await {
                        eprintln!("Failed to write to socket; err = {:?}", e);
                    }
                }
                Err(e) => {
                    eprintln!("Failed to read from socket; err = {:?}", e);
                }
            }
        });
    }
}

5. 异步任务和并发

Tokio 允许并行运行多个异步任务。

#[tokio::main]
async fn main() {
    let task1 = tokio::spawn(async {
        // 模拟一些异步工作
        sleep(Duration::from_secs(1)).await;
        println!("Task 1 completed");
    });

    let task2 = tokio::spawn(async {
        // 模拟另一些异步工作
        sleep(Duration::from_secs(2)).await;
        println!("Task 2 completed");
    });

    let _ = tokio::try_join!(task1, task2);
}

6. 使用 Tokio 的定时器

Tokio 提供了一个方便的定时器,可以用于延迟执行任务:

#[tokio::main]
async fn main() {
    println!("Waiting for 2 seconds...");
    sleep(Duration::from_secs(2)).await;
    println!("2 seconds passed!");
}

7. 错误处理

在异步代码中处理错误与同步代码类似,但通常会使用 Result 类型进行处理。

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let result = do_something_async().await?;
    println!("Result: {}", result);
    Ok(())
}

8. 总结

Tokio 提供了强大的工具来进行异步编程。使用它,可以轻松构建高性能的网络应用。

9. 参考资料

  • Tokio 官方文档
  • Rust 官方文档

http://www.kler.cn/a/385358.html

相关文章:

  • 右旋圆极化散射后的stocks矢量 与T3矩阵的关系
  • Windows Server 怎么关闭IE增强安全配置(关闭IE弹窗)
  • Linux云计算个人学习总结(一)
  • Kafka java 配置
  • 150道MySQL高频面试题,学完吊打面试官--关于索引的五道大厂面试题,跳槽面试很重要
  • C语言必做30道练习题
  • 【SQL server】数据库远程连接配置
  • c++ 分治算法
  • Vue中使用echarts生成地图步骤详解
  • python opencv3
  • Streamlit 入门使用指南及与 FastAPI 的配合使用
  • 如何缩小PPT演示文稿的大小?
  • Spring Boot框架在信息学科平台建设中的实战技巧
  • Linux上的各种查询
  • 关于使用python pptx生成或“复制”PPT页面的问题
  • 鸿蒙进阶篇-属性动画
  • 什么是 OpenTelemetry?
  • 苹果发布iOS 18.2首个公测版:Siri接入ChatGPT、iPhone 16拍照按钮有用了
  • 回调数据丢了?
  • 从0开始学习机器学习--Day19--学习曲线
  • 让Apache正确处理不同编码的文件避免中文乱码
  • Redis 热key总结
  • 各种数据库介绍
  • LeetCode 热题100 之 栈
  • C# 编程语言:跨时代的革命
  • 显存占用 显存测试