SuperAPI AI 工具集

tokio

编程与开发

查看项目

更新于 10-15 20:32

技能介绍

用途:Tokio 是 Rust 的异步执行器,Axum、sqlx、reqwest 与 WebSocket 均运行其上。本技能用于在 Rust 后端中正确组织异步结构,包括任务派生、阻塞隔离、超时、取消与通道通信。

主要能力与规则:不要阻塞 worker,避免 std::thread::sleep、重型 std::fs、长时间持有 std 互斥锁或在 handler 中做同步 DNS/等待;CPU、文件系统与遗留同步代码应放入 spawn_blocking 或改用异步 crate,网络 I/O 使用 Tokio/异步 API。每个任务都要有归宿:JoinHandle、JoinSet 或取消,业务工作不要 fire-and-forget。select! 需公平取消,落败分支不得遗留孤立 I/O,可用 AbortHandle、drop future 或 CancellationToken。请求的 context/deadline 要传播取消,不要忽略 handler 的 JoinHandle。

启动与任务:使用 #[tokio::main] 作为入口,axum::serve 与优雅关闭放在 main 中,不要另起第二个运行时。Cargo features 按 crate 实际需要启用 rt-multi-thread、macros、net、sync、time,不要为保险启用 full。spawn 用于与运行时绑定的异步工作,spawn_blocking 用于短 CPU、同步 diesel、zip、bcrypt,JoinSet 用于同一单元的 N 个任务并在 drop 时 abort,LocalSet 用于 !Send 场景(API 中少见)。服务端 spawn 需 'static + Send,状态用 Arc。任务 panic 会得到 JoinError,不要吞掉,应在 shutdown 时 await 或 abort。

时间、取消与通道:用 tokio::time::timeout/sleep,绝不用 thread::sleep;select! 仅在有不变量时用 biased;客户端与服务端 I/O 都要设超时。CancellationToken 用于 WS hub 与 worker,drop token 会中止子任务。通道选择:mpsc 单消费者,broadcast 扇出(lag 会得到 Lagged),watch 保留最后值,oneshot 单次响应;热路径用有界容量,unbounded 仅在别处有背压时使用。

反模式:在异步 handler 中 block_on(会死锁运行时)、每个请求 spawn 一条 SQL 查询(应使用异步连接池)、跨 .await 持有 std::sync::Mutex、测试库中第二个 #[tokio::main] 而非 #[tokio::test]、无 yield_now 或通道的忙循环。

集成与完成标准:HTTP 用 axum,WS 用 rust-axum-websocket,客户端用 reqwest,日志用 tracing,测试用 rust-unit-testing 的 #[tokio::test]。完成标准:新代码无 worker 阻塞、任务在 shutdown 时有 join/取消、通道有界或有 lag 策略、涉及的 I/O 有 Tokio 超时、运行时唯一且与 Axum 对齐。