How to Implement Graceful Shutdown in Async Rust

Implement graceful shutdown in async Rust by using tokio::signal to catch interrupts and broadcast::channel to cancel tasks via tokio::select.

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();
}