Implement graceful shutdown in async Rust by listening for OS signals and canceling running tasks via a shared tokio::sync::broadcast channel or tokio::select!.
use tokio::signal;
use tokio::sync::broadcast;
#[tokio::main]
async fn main() {
let (shutdown_tx, mut shutdown_rx) = broadcast::channel::<()>(1);
// Spawn your worker task
let handle = tokio::spawn(async move {
loop {
tokio::select! {
_ = shutdown_rx.recv() => {
println!("Shutting down...");
break;
}
_ = tokio::time::sleep(tokio::time::Duration::from_secs(1)) => {
// Do work
}
}
}
});
// Listen for Ctrl+C
let _ = signal::ctrl_c().await;
println!("Received Ctrl+C");
let _ = shutdown_tx.send(());
handle.await.ok();
}