How to handle graceful shutdown in Rust web server

Web
Implement graceful shutdown in Rust by using a shared flag to stop the server loop and join threads after receiving an interrupt signal.

Handle graceful shutdown by listening for OS signals and stopping the server loop before joining worker threads.

use std::net::TcpListener;
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
    let shutdown = Arc::new(Mutex::new(false));

    let shutdown_clone = shutdown.clone();
    thread::spawn(move || {
        ctrlc::set_handler(move || {
            *shutdown_clone.lock().unwrap() = true;
        }).unwrap();
    });

    for stream in listener.incoming() {
        if *shutdown.lock().unwrap() {
            break;
        }
        let _stream = stream.unwrap();
        println!("Connection established!");
    }

    println!("Shutting down...");
}

Add ctrlc to your Cargo.toml dependencies to capture the interrupt signal.