¿Qué es Tokio y para qué sirve?
\n\nTokio 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\nA 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\nTokio 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
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\nInstalación
\n\nA 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:
[dependencies]\ntokio = { version = "1", features = ["full"] }\n\nLa 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:
[dependencies]\ntokio = { version = "1", features = ["rt", "macros", "net", "io-util", "time", "sync"] }\n\nCaracterísticas principales:
\n- \n
rt— runtime multihilo \n macros— macros#[tokio::main]ytokio::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
Inicio rápido
\n\nCreemos un servidor HTTP simple que responda "Hello, World!" a cualquier solicitud. Para esto también necesitaremos el crate hyper (biblioteca HTTP sobre Tokio):
// 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\nEjecuta cargo run y abre http://127.0.0.1:3000 en el navegador. Verás "Hello, World!".