use std::time::Duration;
use taskvisor::prelude::*;
fn make_worker(name: &'static str) -> TaskSpec {
let task: TaskRef = TaskFn::arc(name, move |ctx| async move {
let mut tick = 0u32;
loop {
match ctx
.run_until_cancelled(tokio::time::sleep(Duration::from_millis(300)))
.await
{
Ok(()) => {
tick += 1;
println!(" [{name}] tick #{tick}");
}
Err(canceled) => {
println!(" [{name}] stopped at tick #{tick}");
return Err(canceled);
}
}
}
});
TaskSpec::restartable(task)
}
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let sup = Supervisor::new(SupervisorConfig::default(), vec![]);
let handle = sup.serve();
println!("Adding worker-a and worker-b...");
let id_a = handle.add(make_worker("worker-a")).await?;
let id_b = handle.add(make_worker("worker-b")).await?;
tokio::time::sleep(Duration::from_secs(1)).await;
println!("Active: {:?}", handle.list().await);
println!("\nRemoving worker-a...");
let removed = handle.remove(id_a).await?;
println!("worker-a removal claimed: {removed}");
let second_claim = handle.cancel(id_a).await?;
println!("worker-a second cancellation claimed: {second_claim}");
println!("Active: {:?}", handle.list().await);
println!("\nAdding worker-c...");
handle.add(make_worker("worker-c")).await?;
tokio::time::sleep(Duration::from_millis(500)).await;
println!("Cancelling worker-b...");
let cancelled = handle.cancel(id_b).await?;
println!("worker-b cancelled: {cancelled}");
println!(
"worker-b alive (best-effort event view): {}",
handle.is_alive("worker-b").await
);
tokio::time::sleep(Duration::from_millis(500)).await;
println!("\nActive: {:?}", handle.list().await);
println!("\nShutting down...");
handle.shutdown().await?;
println!("Done.");
Ok(())
}