JoinSet random order of completition
We can combine several tasks in a JoinSet and then we can calle join_all to wait for all of them to finish that might be in any order.
#[tokio::main]
async fn main() {
simple_logger::SimpleLogger::new().init().unwrap();
log::info!("Start");
let mut tasks = tokio::task::JoinSet::new();
tasks.spawn(async move {
log::info!("Task long starts");
tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
log::info!("Task long is done");
});
std::thread::sleep(std::time::Duration::from_secs(1));
log::info!("Long task started");
for i in 0..5 {
let time = rand::random::<u64>() % 100;
log::info!("Task {i} setup for {time}");
tasks.spawn(async move {
log::info!("Task {i} starts");
tokio::time::sleep(tokio::time::Duration::from_millis(time)).await;
log::info!("Task {i} is done");
});
}
log::info!("All tasks started");
std::thread::sleep(std::time::Duration::from_secs(1));
log::info!("Wait done");
tasks.join_all().await;
log::info!("End");
}
2025-09-17T12:07:02.366Z INFO [demo] Start
2025-09-17T12:07:02.366Z INFO [demo] Task long starts
2025-09-17T12:07:03.366Z INFO [demo] Long task started
2025-09-17T12:07:03.366Z INFO [demo] Task 0 setup for 95
2025-09-17T12:07:03.366Z INFO [demo] Task 1 setup for 87
2025-09-17T12:07:03.366Z INFO [demo] Task 2 setup for 97
2025-09-17T12:07:03.366Z INFO [demo] Task 3 setup for 77
2025-09-17T12:07:03.366Z INFO [demo] Task 4 setup for 87
2025-09-17T12:07:03.366Z INFO [demo] All tasks started
2025-09-17T12:07:03.366Z INFO [demo] Task 0 starts
2025-09-17T12:07:03.366Z INFO [demo] Task 1 starts
2025-09-17T12:07:03.366Z INFO [demo] Task 3 starts
2025-09-17T12:07:03.366Z INFO [demo] Task 4 starts
2025-09-17T12:07:03.366Z INFO [demo] Task 2 starts
2025-09-17T12:07:03.445Z INFO [demo] Task 3 is done
2025-09-17T12:07:03.454Z INFO [demo] Task 4 is done
2025-09-17T12:07:03.454Z INFO [demo] Task 1 is done
2025-09-17T12:07:03.463Z INFO [demo] Task 0 is done
2025-09-17T12:07:03.465Z INFO [demo] Task 2 is done
2025-09-17T12:07:04.366Z INFO [demo] Wait done
2025-09-17T12:07:04.367Z INFO [demo] Task long is done
2025-09-17T12:07:04.367Z INFO [demo] End
[package]
name = "demo"
version = "0.1.0"
edition = "2024"
[dependencies]
log = "0.4.28"
rand = "0.9.2"
simple_logger = "5.0.0"
tokio = { version = "1.47.1", features = ["full"] }