Tokio para Rust: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es Tokio y para qué sirve?

\n\n

Tokio es un runtime asíncrono para el lenguaje de programación Rust. Proporciona una infraestructura para escribir aplicaciones de red rápidas, confiables y escalables. Si estás escribiendo en Rust algo que trabaja con la red, archivos o requiere procesamiento paralelo de solicitudes sin bloquear hilos — necesitas Tokio.

\n\n

A diferencia del enfoque tradicional de múltiples hilos, donde cada solicitud se procesa en un hilo separado del SO (lo cual es costoso y limitado), Tokio utiliza un modelo de entrada/salida asíncrona basado en eventos. Un solo hilo puede manejar miles de conexiones abiertas simultáneamente, cambiando entre tareas solo cuando la tarea actual está esperando (por ejemplo, leyendo de un socket).

\n\n

Tokio no es solo una biblioteca, es un ecosistema. Incluye:

\n
    \n
  • Runtime — planificador de tareas y controladores de eventos (epoll/kqueue/IOCP)
  • \n
  • Protocolos de red estándar — TCP, UDP, Unix sockets
  • \n
  • Temporizadores — sleep, interval, deadline
  • \n
  • Sincronización — mutex, semáforos, barreras para código asíncrono
  • \n
  • Entrada/salida de archivos — lectura/escritura asíncrona de archivos
  • \n
  • Utilidades — canales (mpsc, oneshot, broadcast), buffers, codec
  • \n
\n\n

Tokio está en la base de proyectos conocidos como el framework web Axum, el cliente HTTP Reqwest, los websockets Tungstenite, la base de datos SQLx y muchos otros.

\n\n

Instalación

\n\n

A diferencia de Python (pip) o Node.js (npm), Rust utiliza el sistema de paquetes Cargo. Para instalar Tokio, agrega la dependencia al archivo Cargo.toml:

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

La bandera features = ["full"] incluye todas las funcionalidades de Tokio. Para proyectos en producción, se recomienda seleccionar solo las características necesarias para reducir el tiempo de compilación y el tamaño del binario:

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

Características principales:

\n
    \n
  • rt — runtime multihilo
  • \n
  • macros — macros #[tokio::main] y tokio::select!
  • \n
  • net — TCP, UDP, Unix sockets
  • \n
  • io-util — Reader/Writer asíncronos
  • \n
  • time — temporizadores y sleep
  • \n
  • sync — primitivas de sincronización
  • \n
  • fs — trabajo asíncrono con el sistema de archivos
  • \n
  • process — ejecución asíncrona de comandos
  • \n
  • signal — manejo de señales del SO
  • \n
\n\n

Inicio rápido

\n\n

Creemos un servidor HTTP simple que responda "Hello, World!" a cualquier solicitud. Para esto también necesitaremos el 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

Ejecuta cargo run y abre http://127.0.0.1:3000 en el navegador. Verás "Hello, World!".

\n\n

Métodos y funciones principales

\n\n

1. tokio::spawn

Recommendations