
A comprehensive guide to async Rust that goes beyond the basics. Covers production patterns like JoinSet for concurrent tasks, proper channel selection between mpsc/broadcast/oneshot, graceful shutdown with CancellationToken, and async trait implementations. The error handling section shows both anyhow and thiserror approaches with concrete examples. What I like here is the emphasis on real patterns you actually need in production, not just hello world async examples. The concurrency limiting with buffer_unordered and timeout wrappers address common pain points. Good reference when you're past the "add .await everywhere" stage and need to build robust async systems.
$ npx -y skills add wshobson/agents --skill rust-async-patterns --agent claude-codeInstalls into .claude/skills of the current project.
Production patterns for async Rust programming with Tokio runtime, including tasks, channels, streams, and error handling.
Future (lazy) → poll() → Ready(value) | Pending
↑ ↓
Waker ← Runtime schedules
| Concept | Purpose |
|---|---|
Future | Lazy computation that may complete later |
async fn | Function returning impl Future |
await | Suspend until future completes |
Task | Spawned future running concurrently |
Runtime | Executor that polls futures |
# Cargo.toml
[dependencies]
tokio = { version = "1", features = ["full"] }
futures = "0.3"
async-trait = "0.1"
anyhow = "1.0"
tracing = "0.1"
tracing-subscriber = "0.3"
use tokio::time::{sleep, Duration};
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
// Initialize tracing
tracing_subscriber::fmt::init();
// Async operations
let result = fetch_data("https://api.example.com").await?;
println!("Got: {}", result);
Ok(())
}
async fn fetch_data(url: &str) -> Result<String> {
// Simulated async operation
sleep(Duration::from_millis(100)).await;
Ok(format!("Data from {}", url))
}
Detailed pattern documentation lives in references/details.md. Read that file when the navigation tier above is insufficient.
tokio::select! - For racing futuresJoinSet - For managing multiple tasksCancellationTokenstd::thread::sleep in async? or logSponsors