all these run at once
use tokio::time::{sleep, Duration};
const DURATION_SECS: u64 = 30;
#[tokio::main]
async fn main() {
let inner_counter = tokio::spawn(async {
let mut num: u128 = 0;
for _ in 0..u128::MAX {
num += 1;
println!("inner {num}");
sleep(Duration::from_secs(1)).await;
}
});
let outer_counter = tokio::spawn(async {
inner_counter.await.unwrap();
let mut num: u128 = 0;
for _ in 0..u128::MAX {
num += 1;
println!("outer {num}");
sleep(Duration::from_secs(1)).await;
}
});
let counter = async {
let mut num: u128 = 0;
for _ in 0..u128::MAX {
num += 1;
println!("counter {num}");
sleep(Duration::from_secs(1)).await;
}
};
let counter_2 = async {
let mut num: u128 = 0;
for _ in 0..u128::MAX {
num += 1;
println!("counter_2 {num}");
sleep(Duration::from_secs(1)).await;
}
};
tokio::select! {
_ = sleep(Duration::from_secs(DURATION_SECS)) => {
println!("{DURATION_SECS} seconds have passed.");
},
_ = outer_counter => {
println!("outer_counter has completed.");
},
_ = counter => {
println!("counter has completed.");
},
_ = counter_2 => {
println!("counter0 has completed.");
},
}
}