Estado compartido en Rust
State lleva un handle a lo que tus handlers comparten — un pool, un caché, un contador.
use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc;
use axum::extract::State;
use axum::{routing::get, Router};
#[derive(Clone)]
struct AppState {
hits: Arc<AtomicU64>,
}
async fn count(State(state): State<AppState>) -> String {
let n = state.hits.fetch_add(1, Ordering::Relaxed) + 1;
format!("{n} requests so far")
}
#[tokio::main]
async fn main() {
let state = AppState { hits: Arc::new(AtomicU64::new(0)) };
let app = Router::new().route("/count", get(count)).with_state(state);
let listener = tokio::net::TcpListener::bind("127.0.0.1:8080")
.await
.unwrap();
axum::serve(listener, app).await.unwrap();
}
Cómo funciona
with_statelo adjunta al router.State<T>lo extrae en cada handler.- El valor se clona por petición, así que envuélvelo en un
Arc.
Palabras clave y builtins usados aquí
Stringasyncawaitfnletstructuse
El intento, en números
- Líneas
- 26
- Caracteres a escribir
- 626
- Tokens
- 189
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 103 segundos.
Paso 2 de 2 en Extractores y estado; paso 5 de 9 en Servicios web con axum.