Tokio使用Rust编写可靠异步应用程序的运行时

Tokio


一个使用 Rust 编程语言编写可靠、异步且精简应用程序的运行时。

  • 快速:Tokio 的零成本抽象为您提供裸机性能。
  • 可靠:Tokio 利用 Rust 的所有权、类型系统和
    并发模型来减少错误并确保线程安全。
  • 可扩展:Tokio 占用空间极小,并能自然地处理背压和取消。

网站 | 指南 | API 文档

概述

Tokio 是一个事件驱动的非阻塞 I/O 平台,用于使用 Rust 编程语言编写异步应用程序。概括而言,它提供了以下几个主要组件:

  • 一个基于工作窃取的多线程任务 [调度器]。
  • 一个由操作系统事件队列(epoll、kqueue、IOCP 等)支持的 Reactor。
  • 异步 [TCP 和 UDP][net] 套接字。

这些组件提供了构建异步应用程序所需的运行时组件。

[net]:https://docs.rs/tokio/latest/tokio/net/index.html
[scheduler]:https://docs.rs/tokio/latest/tokio/runtime/index.html

示例

使用 Tokio 构建一个基本的 TCP 回显服务器。
请确保您在 Cargo.toml 上激活了 tokio crate 的全部功能:

toml 复制代码
[dependencies]
tokio = { version = "1.48.0", features = ["full"] }

Then, on your main.rs:

rust,no_run 复制代码
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let listener = TcpListener::bind("127.0.0.1:8080").await?;

    loop {
        let (mut socket, _) = listener.accept().await?;

        tokio::spawn(async move {
            let mut buf = [0; 1024];

            // In a loop, read data from the socket and write the data back.
            loop {
                let n = match socket.read(&mut buf).await {
                    // socket closed
                    Ok(0) => return,
                    Ok(n) => n,
                    Err(e) => {
                        eprintln!("failed to read from socket; err = {:?}", e);
                        return;
                    }
                };

                // Write the data back
                if let Err(e) = socket.write_all(&buf[0..n]).await {
                    eprintln!("failed to write to socket; err = {:?}", e);
                    return;
                }
            }
        });
    }
}

如需更详细的“真实世界”示例,请参阅[mini-redis] 代码库。

[示例]:https://github.com/tokio-rs/tokio/tree/master/examples
[mini-redis]:https://github.com/tokio-rs/mini-redis/

如需查看可启用的功能标志列表,请查看我们的文档。

获取帮助

首先,请查看您的问题的答案是否可以在指南API 文档中找到。如果没有找到答案,请在Tokio Discord 服务器中咨询一个活跃的社区。我们很乐意尝试回答您的问题。您也可以在讨论页面讨论上提问。

贡献

感谢您对改进项目的帮助!我们非常高兴您能来!我们准备了一份贡献指南,帮助您参与 Tokio项目。

相关项目

除了本仓库中的 crate 之外,Tokio 项目还维护着其他几个库,包括:

  • axum:一个专注于人体工程学和模块化的 Web 应用程序框架。

  • hyper:一个快速且准确的 Rust HTTP/1.1 和 HTTP/2 实现。

  • tonic:一个基于 HTTP/2 的 gRPC 实现,专注于高性能、互操作性和灵活性。

  • warp:一个超级简单、可组合的 Web 服务器框架,速度飞快。

  • tower:一个模块化且可重用组件库,用于构建强大的网络客户端和服务器。

  • tracing(原名tokio-trace):一个用于应用程序级跟踪和异步感知诊断的框架。

  • mio:基于操作系统 I/O API 的低级跨平台抽象,为 tokio 提供支持。

  • bytes:用于处理字节的实用程序,包括高效的字节缓冲区。

  • loom:用于并发 Rust 代码的测试工具。

支持的 Rust 版本

Tokio 将保持至少 6 个月的滚动 MSRV(最低支持 Rust 版本)政策。提升 MSRV 时,新的 Rust 版本必须至少在六个月前发布。当前的 MSRV 为 1.71。

请注意,MSRV 不会自动提升,只会作为小版本发布的一部分。过去次要版本的 MSRV 历史记录如下:

  • 1.48 至今 - Rust 1.71
  • 1.39 至 1.47 - Rust 1.70
  • 1.30 至 1.38 - Rust 1.63
  • 1.27 至 1.29 - Rust 1.56
  • 1.17 至 1.26 - Rust 1.49
  • 1.15 至 1.16 - Rust 1.46
  • 1.0 至 1.14 - Rust 1.45

请注意,尽管我们尽量避免依赖项间接增加 Tokio 的 MSRV 的情况,但我们不保证这种情况不会发生。但是,每个次要版本都会包含一些与该次要版本的 MSRV 兼容的依赖项版本。

发布时间表

Tokio 没有固定的发布时间表,但我们通常每月发布一个次要版本。我们会根据需要发布补丁版本来修复错误。

错误修补政策

为了发布包含错误修复的补丁版本,我们指定了某些次要版本作为 LTS(长期支持)版本。如果某个错误需要发布包含该错误修复的补丁版本,我们会将其反向移植并作为每个 LTS 次要版本的新补丁版本发布。我们目前的 LTS版本如下:

  • 1.43.x - LTS 版本,有效期至 2026 年 3 月。(MSRV 1.70)
  • 1.47.x - LTS 版本,有效期至 2026 年 9 月。(MSRV 1.70)

每个 LTS 版本将继续接收反向移植的修复,持续至少一年。如果您希望在项目中使用已修复的次要版本,我们建议您使用 LTS 版本。

要使用固定的次要版本,您可以使用波浪号指定版本。例如,要指定您希望使用最新的 1.43.x 补丁版本,您可以使用以下依赖项规范:

text 复制代码
tokio = { version = "~1.43", features = [...] }

之前的 LTS 版本

  • 1.8.x - LTS 版本有效期至 2022 年 2 月。
  • 1.14.x - LTS 版本有效期至 2022 年 6 月。
  • 1.18.x - LTS 版本有效期至 2023 年 6 月。
  • 1.20.x - LTS 版本有效期至 2023 年 9 月。
  • 1.25.x - LTS 版本有效期至 2024 年 3 月。
  • 1.32.x - LTS 版本有效期至 2024 年 9 月。
  • 1.36.x - LTS 版本有效期至 2025 年 3 月。
  • 1.38.x - LTS 版本有效期至 2025 年 7 月。

许可证

本项目采用 MIT 许可证

关于项目

Tokio 是 Rust 编程语言的异步运行时。它提供了 I/O、网络、调度、计时器等功能模块。它能够灵活地支持各种系统,从拥有数十个核心的大型服务器到小型嵌入式设备。
MIT
Rust
30,354
2845
315
2016-09-10
2025-11-27

增长趋势 - stars