tokio
Tokio é o runtime assíncrono de fato para serviços de rede em Rust. Ele fornece um executor, timers, IO assíncrono e primitivas de sincronização construídas para async/await.
Receita
[dependencies]
tokio = { version = "1", features = ["full"] }#[tokio::main]
async fn main() {
let handle = tokio::spawn(async {
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
42
});
let n = handle.await.unwrap();
assert_eq!(n, 42);
}Quando usar isto:
- Servidores HTTP (
axum,hyper) - Pools de banco de dados (
sqlx) - Daemons de longa duração com conexões concorrentes
Exemplo Funcional
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:0").await?;
let addr = listener.local_addr()?;
tokio::spawn(async move {
let (mut socket, _) = listener.accept().await.unwrap();
let mut buf = [0u8; 4];
socket.read_exact(&mut buf).await.unwrap();
socket.write_all(b"pong").await.unwrap();
});
let mut client = tokio::net::TcpStream::connect(addr).await?;
client.write_all(b"ping").await?;
let mut out = [0u8; 4];
client.read_exact(&mut out).await?;
assert_eq!(&out, b"pong");
Ok(())
}O que isto demonstra:
#[tokio::main]configura o runtime multi-threadspawnexecuta tarefas concorrentes- IO assíncrono sem bloquear threads
Mergulho Profundo
Recursos do Runtime
| Conjunto de recursos | Uso |
|---|---|
rt-multi-thread | Servidores de produção (padrão em full) |
rt | Embutido single-threaded ou testes |
macros | #[tokio::main], #[tokio::test] |
time | sleep, interval, timeouts |
Link Cruzado
Veja a seção Noções básicas do Tokio para canais, select!, desligamento gracioso e integração de tracing.
Armadilhas
- Bloqueio em async -
std::fs::readbloqueia a thread trabalhadora. Correção:tokio::task::spawn_blockingoutokio::fs. - Trabalho intensivo de CPU no runtime - priva o IO. Correção: pool de threads dedicado ou
rayon. - Surpresas do runtime
current_thread- tarefas só executam quando são sondadas em uma thread. Correção: use multi-thread para servidores. - Canais ilimitados - a memória cresce sob carga. Correção: canais limitados com backpressure.
enable_ioausente - builder de runtime personalizado sem o recurso IO falha ao aceitar. Correção: espelhe os recursosfullexplicitamente.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
async-std | Bases de código legadas | Crates do ecossistema Tokio Greenfield |
smol | Runtime leve | Pilhas Axum/sqlx pesadas |
| Threads síncronas | Ferramentas de lote CLI | Milhares de conexões concorrentes |
FAQs
Tokio 1.x está estável?
Sim. Pequenas atualizações 1.x são compatíveis com semver. Fixe 1 em Cargo.toml.
Quantas threads trabalhadoras?
O padrão são os núcleos da CPU. Ajuste com worker_threads(n) em RuntimeBuilder para cargas de trabalho mistas.
Posso misturar sync e async?
Sim, nas fronteiras: spawne tarefas bloqueantes para bibliotecas síncronas; mantenha o async na borda da rede.
Tokio substitui threads?
Não. Use threads para paralelismo de CPU; Tokio para espera de IO concorrente.
Relacionado
- Noções básicas do Tokio - seção completa
- reqwest & sqlx - HTTP e DB assíncronos
- tracing - logging ciente de async
- Skill de Async / Tokio - padrões de revisão de agente
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.