Async Rust with Tokio runtime
Pro scans all 2 files and shows the line behind each finding
Scanned 9/29/2026
npx -y skills add ssrjkk/claude-skills --skill rust-tokio --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Rust Tokio?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/ssrjkk-rust-tokio)More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.
---
name: rust-tokio
description: "Async Rust with Tokio runtime"
category: backend
tags: [rust, tokio, async, concurrency, runtime]
models: [sonnet, opus]
version: 1.0.0
created: 2026-05-14
updated: 2026-09-06
---
# Rust Tokio
> Build high-performance async applications in Rust using the Tokio runtime.
## Quick Start
```rust
use tokio::net::TcpListener;
use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader};
use std::sync::Arc;
use tokio::sync::Mutex;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
let counter = Arc::new(Mutex::new(0u64));
println!("Server listening on :8080");
loop {
let (socket, addr) = listener.accept().await?;
let counter = counter.clone();
tokio::spawn(async move {
println!("New connection: {}", addr);
let (reader, mut writer) = socket.into_split();
let mut buf_reader = BufReader::new(reader);
let mut line = String::new();
loop {
line.clear();
match buf_reader.read_line(&mut line).await {
Ok(0) => break, // EOF
Ok(_) => {
let response = format!("Echo: {}", line.trim());
// Update shared counter
let mut count = counter.lock().await;
*count += 1;
drop(count);
if let Err(e) = writer.write_all(response.as_bytes()).await {
eprintln!("Write error: {}", e);
break;
}
if let Err(e) = writer.write_all(b"\n").await {
eprintln!("Write error: {}", e);
break;
}
}
Err(e) => {
eprintln!("Read error: {}", e);
break;
}
}
}
println!("Connection closed: {}", addr);
});
}
}
```
```rust
// Async HTTP client
use reqwest;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Concurrent requests with join
let urls = vec![
"https://api.example.com/users",
"https://api.example.com/products",
"https://api.example.com/orders",
];
let mut handles = Vec::new();
for url in urls {
handles.push(tokio::spawn(async move {
reqwest::get(url).await.unwrap().text().await.unwrap()
}));
}
// Join all concurrent requests
for handle in handles {
let result = handle.await?;
println!("Got response: {} bytes", result.len());
}
Ok(())
}
```
## Key Concepts
Tokio is an async runtime for Rust providing I/O, timers, synchronization primitives, and task scheduling. Use `#[tokio::main]` to enter async context. `tokio::spawn` creates concurrent tasks. Use `Mutex`/`RwLock` for shared state.
## When to Use
- High-throughput network services (HTTP servers, proxies)
- Real-time systems (chat, gaming, streaming)
- Concurrent data processing pipelines
- Microservices requiring maximum performance
## Step-by-Step
1. Add Tokio: `cargo add tokio --features full` and set an async `main` with `#[tokio::main]`.
2. Pick the I/O primitive: `TcpListener`/`TcpStream` for sockets, `UnixListener` for local pipes, `tokio::fs` for async file access.
3. Handle each connection by `tokio::spawn` — never block tokio worker threads with synchronous work.
4. Share state via `tokio::sync::Mutex`/`RwLock` (or actor channels) cloned into tasks.
5. Add concurrency: use `tokio::join!`/`try_join!` for parallel awaits and `tokio::time::timeout` for deadlines.
6. Tune the runtime: set worker threads and run tests with `cargo test` under `--cfg tokio_unstable` if multi-thread stats are needed.
## Examples
```rust
// Fan-out to N concurrent tasks and aggregate results
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let handles: Vec<_> = (0..5)
.map(|i| tokio::spawn(async move {
sleep(Duration::from_millis(100 * i)).await;
i * i
}))
.collect();
let mut total = 0;
for h in handles {
total += h.await?;
}
println!("sum of squares = {total}");
Ok(())
}
```
```rust
// Graceful shutdown with CancellationToken
use tokio_util::sync::CancellationToken;
#[tokio::main]
async fn main() {
let token = CancellationToken::new();
let child = token.clone();
tokio::spawn(async move {
tokio::select! {
_ = child.cancelled() => println!("task cancelled"),
_ = tokio::time::sleep(Duration::from_secs(60)) => println!("task done"),
}
});
tokio::time::sleep(Duration::from_millis(50)).await;
token.cancel();
tokio::time::sleep(Duration::from_millis(50)).await;
}
```
1. Add Tokio: `cargo add tokio --features full` and set an async `main` with `#[tokio::main]`.
2. Pick the I/O primitive: `TcpListener`/`TcpStream` for sockets, `UnixListener` for local pipes, `tokio::fs` for async file access.
3. Handle each connection by `tokio::spawn` — never block tokio worker threads with synchronous work.
4. Share state via `tokio::sync::Mutex`/`RwLock` (or actor channels) cloned into tasks.
5. Add concurrency: use `tokio::join!`/`try_join!` for parallel awaits and `tokio::time::timeout` for deadlines.
6. Tune the runtime: set worker threads and run tests with `cargo test` under `--cfg tokio_unstable` if multi-thread stats are needed.
```rust
// Fan-out to N concurrent tasks and aggregate results
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let handles: Vec<_> = (0..5)
.map(|i| tokio::spawn(async move {
sleep(Duration::from_millis(100 * i)).await;
i * i
}))
.collect();
let mut total = 0;
for h in handles {
total += h.await?;
}
println!("sum of squares = {total}");
Ok(())
}
```
```rust
// Graceful shutdown with CancellationToken
use tokio_util::sync::CancellationToken;
#[tokio::main]
async fn main() {
let token = CancellationToken::new();
let child = token.clone();
tokio::spawn(async move {
tokio::select! {
_ = child.cancelled() => println!("task cancelled"),
_ = tokio::time::sleep(Duration::from_secs(60)) => println!("task done"),
}
});
tokio::time::sleep(Duration::from_millis(50)).await;
token.cancel();
tokio::time::sleep(Duration::from_millis(50)).await;
}
```
## Validation
1. `cargo run` starts server without panics
2. Multiple concurrent connections are handled
3. Shared state synchronization is race-condition free
4. Performance benchmarks show expected throughput
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!