Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions diagrams/08-select-timeouts.mmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
flowchart LR
S[select!] --> A[Rama preparada]
S --> B[Otras ramas pendientes]
T[timeout] --> O[Éxito o expiración]
42 changes: 42 additions & 0 deletions docs/08-select-cancelacion-y-timeouts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# select!, Cancelación y Timeouts

> **Curso:** Rust Async · **Capítulo:** 08 · **Código:** `src/coordination.rs` · **Estado:** draft

## Introducción

`select!` permite reaccionar a la primera operación preparada. Los timeouts
hacen explícito cuánto se acepta esperar; cancelar exige que cada punto de
suspensión conserve invariantes válidas.

## Fundamentos

Una rama ganadora no demuestra que las demás terminaron. Un timeout devuelve
éxito o expiración, no una conclusión sobre la causa del retraso. Al soltar un
future pendiente puede ocurrir cancelación, por lo que la operación debe ser
segura de abandonar.

```mermaid
flowchart LR
S[select!] --> A[Rama preparada]
S --> B[Otras ramas pendientes]
T[timeout] --> O[Éxito o expiración]
```

## Modelo y Límites

El modelo usa una rama inmediata y otra pendiente para que el resultado sea
determinista. No pretende afirmar equidad del macro ni modelar cancelación de
recursos externos.

```rust
assert_eq!(rust_async::coordination::first_ready().await, "immediate");
```

## Ejercicios y Referencias

1. Añade una tercera rama pendiente.
2. Distingue timeout de error de aplicación.
3. Diseña una operación cancelable por etapas.
4. Explica por qué ganar `select!` no cancela automáticamente todo recurso.

Referencia: [tokio::select!](https://docs.rs/tokio/latest/tokio/macro.select.html).
4 changes: 2 additions & 2 deletions docs/superpowers/plans/2026-07-28-rust-async-course.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ Para cada capítulo, antes de pasar al siguiente:
- [x] #25 Escribir capítulo, comparativas, ejemplos y ejercicios.
- [ ] Capítulo 08: `select!`, cancelación y timeouts.
- [x] #26 Especificar garantías y alternativas.
- [ ] #27 Implementar y probar modelos deterministas.
- [ ] #28 Escribir capítulo, diagrama, ejemplos y ejercicios.
- [x] #27 Implementar y probar modelos deterministas.
- [x] #28 Escribir capítulo, diagrama, ejemplos y ejercicios.
- [ ] Capítulo 09: canales y sincronización asíncrona.

### Milestone 4: Composición avanzada
Expand Down
10 changes: 10 additions & 0 deletions examples/select_timeout_basic.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#[tokio::main]
async fn main() {
assert_eq!(rust_async::coordination::first_ready().await, "immediate");
assert_eq!(
rust_async::coordination::immediate_with_timeout()
.await
.expect("operation should finish"),
1
);
}
Loading