select! y timeouts en Rust
select! toma el primer futuro que termine — la forma de todo timeout.
use tokio::time::{sleep, timeout, Duration};
async fn slow() -> &'static str {
sleep(Duration::from_millis(200)).await;
"slow finished"
}
#[tokio::main]
async fn main() {
tokio::select! {
result = slow() => println!("{result}"),
_ = sleep(Duration::from_millis(50)) => println!("gave up first"),
}
match timeout(Duration::from_millis(50), slow()).await {
Ok(value) => println!("{value}"),
Err(_) => println!("timed out"),
}
}
Cómo funciona
- Cada rama es un futuro y el código a correr cuando gana.
- Los futuros perdedores se sueltan, y eso los cancela.
timeoutenvuelve la misma idea en una sola llamada.
Palabras clave y builtins usados aquí
ErrOkasyncawaitfnmatchstaticstruse
El intento, en números
- Líneas
- 19
- Caracteres a escribir
- 428
- Tokens
- 135
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 74 segundos.
Paso 4 de 6 en Async con tokio; paso 12 de 15 en Concurrencia y async.