Tokio para Rust: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Tokio e para que serve?

\n\n

Tokio é um runtime assíncrono para a linguagem de programação Rust. Ele fornece infraestrutura para escrever aplicações de rede rápidas, confiáveis e escaláveis. Se você está escrevendo em Rust algo que trabalha com rede, arquivos ou requer processamento paralelo de requisições sem bloqueio de threads — você precisa do Tokio.

\n\n

Diferente da abordagem tradicional multithread, onde cada requisição é processada em uma thread separada do SO (o que é caro e limitado), o Tokio utiliza um modelo de entrada/saída assíncrona baseado em eventos. Uma única thread pode processar milhares de conexões simultâneas abertas, alternando entre tarefas apenas quando a tarefa atual está esperando (por exemplo, leitura de um socket).

\n\n

Tokio não é apenas uma biblioteca, é um ecossistema. Ele inclui:

\n
    \n
  • Runtime — escalonador de tarefas e drivers de eventos (epoll/kqueue/IOCP)
  • \n
  • Protocolos de rede padrão — TCP, UDP, Unix sockets
  • \n
  • Temporizadores — sleep, interval, deadline
  • \n
  • Sincronização — mutexes, semáforos, barreiras para código assíncrono
  • \n
  • Entrada/Saída de arquivos — leitura/escrita assíncrona de arquivos
  • \n
  • Utilitários — canais (mpsc, oneshot, broadcast), buffers, codec
  • \n
\n\n

Tokio está na base de projetos conhecidos como o framework web Axum, o cliente HTTP Reqwest, websockets Tungstenite, banco de dados SQLx e muitos outros.

\n\n

Instalação

\n\n

Diferente do Python (pip) ou Node.js (npm), o Rust utiliza o sistema de pacotes Cargo. Para instalar o Tokio, adicione a dependência no arquivo Cargo.toml:

\n\n
[dependencies]\ntokio = { version = "1", features = ["full"] }
\n\n

A flag features = ["full"] ativa todas as funcionalidades do Tokio. Para projetos em produção, recomenda-se selecionar apenas os recursos necessários para reduzir o tempo de compilação e o tamanho do binário:

\n\n
[dependencies]\ntokio = { version = "1", features = ["rt", "macros", "net", "io-util", "time", "sync"] }
\n\n

Principais recursos:

\n
    \n
  • rt — runtime multithread
  • \n
  • macros — macros #[tokio::main] e tokio::select!
  • \n
  • net — TCP, UDP, Unix sockets
  • \n
  • io-util — Reader/Writer assíncronos
  • \n
  • time — temporizadores e sleep
  • \n
  • sync — primitivas de sincronização
  • \n
  • fs — trabalho assíncrono com sistema de arquivos
  • \n
  • process — execução assíncrona de comandos
  • \n
  • signal — tratamento de sinais do SO
  • \n
\n\n

Início rápido

\n\n

Vamos criar um servidor HTTP simples que responde "Hello, World!" a qualquer requisição. Para isso, precisaremos também do crate hyper (biblioteca HTTP sobre Tokio):

\n\n
// Cargo.toml\n// [dependencies]\n// tokio = { version = "1", features = ["full"] }\n// hyper = { version = "1", features = ["server", "http1"] }\n\nuse hyper::service::service_fn;\nuse hyper::{Request, Response, Server};\nuse hyper::body::Incoming;\nuse std::convert::Infallible;\n\nasync fn handle_request(_req: Request<Incoming>) -> Result<Response<String>, Infallible> {\n    Ok(Response::new("Hello, World!".to_string()))\n}\n\n#[tokio::main]\nasync fn main() {\n    let addr = ([127, 0, 0, 1], 3000).into();\n    let server = Server::bind(&addr).serve(service_fn(handle_request));\n    println!("Server running on http://{}", addr);\n    if let Err(e) = server.await {\n        eprintln!("Server error: {}", e);\n    }\n}
\n\n

Execute cargo run e abra http://127.0.0.1:3000 no navegador. Você verá "Hello, World!".

\n\n

Métodos e funções principais

\n\n

1. tokio::spawn

Recommendations