技能 rust-async-patterns
📦

rust-async-patterns

安全

掌握 Rust 异步编程模式

也可从以下获取: wshobson

构建异步 Rust 应用程序需要理解复杂的并发模式。本技能提供生产就绪的 Tokio 模式,涵盖任务、通道、流和优雅关闭处理。

支持: Claude Codex Code(CC)
🥉 75 青铜
1

下载技能 ZIP

2

在 Claude 中上传

前往 设置 → 功能 → 技能 → 上传技能

3

开启并开始使用

测试它

正在使用“rust-async-patterns”。 创建一个异步函数,从 5 个 URL 获取数据,并发限制为 3

预期结果:

使用 stream::iter 和 buffer_unordered(3) 并发处理 URL,返回 Vec 类型的 Results,对每个 fetch 操作进行正确的错误处理。

正在使用“rust-async-patterns”。 如何在异步任务之间安全地共享状态?

预期结果:

推荐对读多写少的工作负载使用 Arc<RwLock<T>>,对写多场景使用 Arc<Mutex<T>>,并提供展示 .read().await 和 .write().await 模式的示例。

安全审计

安全
v1 • 2/24/2026

All 51 static analysis findings are false positives. The skill contains documentation-only markdown files with Rust code examples. The static analyzer incorrectly flagged: markdown code fence backticks as shell execution, tokio::spawn (async task spawning) as process execution, SQL queries as system reconnaissance, and example URLs as hardcoded secrets. No executable code or security risks present.

2
已扫描文件
553
分析行数
0
发现项
1
审计总数
未发现安全问题
审计者: claude

质量评分

38
架构
100
可维护性
87
内容
50
社区
100
安全
100
规范符合性

你能构建什么

网络服务开发

使用 Tokio 任务和通道构建并发 HTTP 服务器或 WebSocket 处理器,用于请求分发和优雅关闭。

数据管道实现

使用异步流处理流式数据,使用 buffer_unordered 进行受控并发,并实现正确的错误传播。

异步代码调试

诊断死锁问题、理解任务取消、并为异步应用程序实现正确的追踪 instrumentation。

试试这些提示

基本异步任务设置
帮我设置一个基本的 Tokio 异步应用程序,带有正确的错误处理。我需要并发地从多个 URL 获取数据并优雅地处理任何失败。
基于通道的通信
我需要实现一个工作者池模式,其中多个生产者任务将工作项发送给消费者任务。展示如何使用带有正确关闭处理的 mpsc 通道。
优雅关闭实现
我的异步服务器需要处理 SIGINT/SIGTERM 并干净地关闭。所有进行中的请求应在强制终止前 30 秒内完成。使用 CancellationToken 实现这一点。
带背压的流处理
我正在将大型数据集作为流进行处理。实现分块处理,使用 buffer_unordered 将并发限制为 10 个项目,并对失败项目进行正确的错误处理。

最佳实践

  • 在长时间运行的任务中使用 tokio::select! 进行 future 竞速并实现取消点
  • 优先使用通道而非共享状态进行任务通信,以避免死锁并减少锁竞争
  • 使用 tracing 属性 instrument 异步函数,并尊重 CancellationToken 实现优雅关闭

避免

  • 使用 std::thread::sleep 或阻塞 I/O 操作阻塞异步代码,导致运行时饥饿
  • 在 await 点持有锁,当多个任务争用相同锁时可能导致死锁
  • 生成无边界任务而不使用 semaphore 或 JoinSet 限制,导致资源耗尽

常见问题

tokio::spawn 和 std::thread::spawn 有什么区别?
tokio::spawn 创建由 Tokio 运行时调度的轻量级异步任务,而 std::thread::spawn 创建操作系统线程。Tokio 任务更便宜且可以被取消,但需要 async/await 语法。
何时应该使用通道而不是共享状态 (Mutex/RwLock)?
使用通道在任务之间传递消息以避免锁竞争和死锁。当任务需要真正的共享内存访问或缓存频繁读取的数据时使用共享状态。
如何在异步 Rust 中处理超时?
使用 tokio::time::timeout() 包装带有持续时间的 futures。它返回 Result<Result<T, InnerError>, Elapsed>,其中 Elapsed 表示超时已超出。
async-trait crate 的目的是什么?
Rust 本身不支持 trait 中的 async fn。async-trait crate 提供一个过程宏,将异步 trait 方法转换为 boxed futures,从而实现异步多态。
如何调试异步 Rust 应用程序?
使用 tokio-console 配合 RUSTFLAGS='--cfg tokio_unstable' 进行运行时任务监控。使用 #[instrument] 添加 tracing span,并使用 tracing-subscriber 进行结构化日志记录。
什么是 buffer_unordered,何时应该使用它?
buffer_unordered(n) 将流项目的并发处理限制为 n 个。当并发处理许多项目(如速率受限的 API 调用)时,使用它来防止资源耗尽。