文章目录TokioRust 异步运行时32K Star 的底层基建1、 这玩意儿是干嘛的2、 为什么要用它3、 怎么用4、 生态里还有什么5、 适合谁TokioRust 异步运行时32K Star 的底层基建Tokio 在 GitHub 上已经拿到 32,380 Star 了。这是一个用 Rust 写的异步运行时专门干一件事让你用 Rust 写出高性能的异步应用。TCP 服务器、HTTP 服务、gRPC 接口只要是 I/O 密集型的场景它都能接住。1、 这玩意儿是干嘛的简单说Rust 标准库没有自带异步运行时Tokio 就是填这个坑的。它提供三个核心组件一个多线程、工作窃取的任务调度器一个基于操作系统事件队列epoll、kqueue、IOCP的 reactor以及异步的 TCP 和 UDP socket。有了这三个东西你就能在 Rust 里写async/await风格的异步代码不用自己手动管理线程池或者轮询 I/O。2、 为什么要用它写过异步代码的人都知道最难的不是业务逻辑是底层的调度和 I/O 管理。自己写线程池要考虑任务窃取、负载均衡、取消传播。自己对接 epoll要处理边缘触发、水平触发、文件描述符泄漏。每一步都可能踩坑踩完还要调。Tokio 把这些全封装了。你写async fn它负责调度。你调socket.read().await它负责在数据就绪时唤醒你的任务。零成本抽象性能接近裸写 C。3、 怎么用在 Cargo.toml 里加上依赖[dependencies] tokio { version 1.52.3, features [full] }然后就能写了。一个最简单的 TCP echo serverusetokio::net::TcpListener;usetokio::io::{AsyncReadExt,AsyncWriteExt};#[tokio::main]asyncfnmain()-Result(),Boxdynstd::error::Error{letlistenerTcpListener::bind(127.0.0.1:8080).await?;loop{let(mutsocket,_)listener.accept().await?;tokio::spawn(asyncmove{letmutbuf[0;1024];loop{letnmatchsocket.read(mutbuf).await{Ok(0)return,Ok(n)n,Err(e){eprintln!(failed to read from socket; err {:?},e);return;}};ifletErr(e)socket.write_all(buf[0..n]).await{eprintln!(failed to write to socket; err {:?},e);return;}}});}}#[tokio::main]宏帮你启动运行时tokio::spawn把每个连接扔到独立的任务里。整个过程没有手动管理线程也没有回调地狱。4、 生态里还有什么Tokio 不只是一个运行时它是一整个生态的底座。Web 框架有 axumHTTP 实现有 hypergRPC 有 tonic中间件抽象有 tower链路追踪有 tracing。这些库全部围绕 Tokio 的异步模型构建互相之间可以无缝组合。如果你在做微服务、API 网关、或者任何需要高并发 I/O 的 Rust 项目Tokio 基本是绕不开的基础设施。5、 适合谁在用 Rust 写网络服务、需要处理大量并发连接的开发者在做微服务架构、需要一个可靠异步运行时的团队想学 Rust 异步编程、需要一个成熟项目作为参考的人在用 Rust 写网络服务、需要处理大量并发连接的开发者在做微服务架构、需要一个可靠异步运行时的团队想学 Rust 异步编程、需要一个成熟项目作为参考的人
Tokio:Rust 异步运行时,32K Star 的底层基建
文章目录TokioRust 异步运行时32K Star 的底层基建1、 这玩意儿是干嘛的2、 为什么要用它3、 怎么用4、 生态里还有什么5、 适合谁TokioRust 异步运行时32K Star 的底层基建Tokio 在 GitHub 上已经拿到 32,380 Star 了。这是一个用 Rust 写的异步运行时专门干一件事让你用 Rust 写出高性能的异步应用。TCP 服务器、HTTP 服务、gRPC 接口只要是 I/O 密集型的场景它都能接住。1、 这玩意儿是干嘛的简单说Rust 标准库没有自带异步运行时Tokio 就是填这个坑的。它提供三个核心组件一个多线程、工作窃取的任务调度器一个基于操作系统事件队列epoll、kqueue、IOCP的 reactor以及异步的 TCP 和 UDP socket。有了这三个东西你就能在 Rust 里写async/await风格的异步代码不用自己手动管理线程池或者轮询 I/O。2、 为什么要用它写过异步代码的人都知道最难的不是业务逻辑是底层的调度和 I/O 管理。自己写线程池要考虑任务窃取、负载均衡、取消传播。自己对接 epoll要处理边缘触发、水平触发、文件描述符泄漏。每一步都可能踩坑踩完还要调。Tokio 把这些全封装了。你写async fn它负责调度。你调socket.read().await它负责在数据就绪时唤醒你的任务。零成本抽象性能接近裸写 C。3、 怎么用在 Cargo.toml 里加上依赖[dependencies] tokio { version 1.52.3, features [full] }然后就能写了。一个最简单的 TCP echo serverusetokio::net::TcpListener;usetokio::io::{AsyncReadExt,AsyncWriteExt};#[tokio::main]asyncfnmain()-Result(),Boxdynstd::error::Error{letlistenerTcpListener::bind(127.0.0.1:8080).await?;loop{let(mutsocket,_)listener.accept().await?;tokio::spawn(asyncmove{letmutbuf[0;1024];loop{letnmatchsocket.read(mutbuf).await{Ok(0)return,Ok(n)n,Err(e){eprintln!(failed to read from socket; err {:?},e);return;}};ifletErr(e)socket.write_all(buf[0..n]).await{eprintln!(failed to write to socket; err {:?},e);return;}}});}}#[tokio::main]宏帮你启动运行时tokio::spawn把每个连接扔到独立的任务里。整个过程没有手动管理线程也没有回调地狱。4、 生态里还有什么Tokio 不只是一个运行时它是一整个生态的底座。Web 框架有 axumHTTP 实现有 hypergRPC 有 tonic中间件抽象有 tower链路追踪有 tracing。这些库全部围绕 Tokio 的异步模型构建互相之间可以无缝组合。如果你在做微服务、API 网关、或者任何需要高并发 I/O 的 Rust 项目Tokio 基本是绕不开的基础设施。5、 适合谁在用 Rust 写网络服务、需要处理大量并发连接的开发者在做微服务架构、需要一个可靠异步运行时的团队想学 Rust 异步编程、需要一个成熟项目作为参考的人在用 Rust 写网络服务、需要处理大量并发连接的开发者在做微服务架构、需要一个可靠异步运行时的团队想学 Rust 异步编程、需要一个成熟项目作为参考的人