Exécution concurrente sans spawn
Avancé// join! : attend TOUS les futures, exécutés en concurrence
let (a, b) = tokio::join!(appel_a(), appel_b());
// try_join! : s'arrête à la première erreur
let (a, b) = tokio::try_join!(appel_a(), appel_b())?;
// select! : réagit au PREMIER qui se termine, annule les autres
tokio::select! {
r = appel_lent() => println!("résultat : {r}"),
_ = tokio::time::sleep(Duration::from_secs(5)) => println!("timeout"),
}