typestar

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

  1. with_state lo adjunta al router.
  2. State<T> lo extrae en cada handler.
  3. El valor se clona por petición, así que envuélvelo en un Arc.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 2 en Extractores y estado; paso 5 de 9 en Servicios web con axum.

← Anterior Siguiente →