Skip to content

Dav1dde/elegant-departure

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Elegant Departure

Crates.io License Build Status docs.rs

Rust crate to simplify graceful async shutdowns:

  • Easy to use with a minimal API
  • Runtime independent (works with tokio, async-std, smol, …)
  • Additional integrations for tokio (shutdown on ctrl-c, signals etc.)

Usage

This crate is on crates.io and can be used by adding it to your dependencies in your project's Cargo.toml.

[dependencies]
elegant-departure = "0.3"

For a optional tokio integration, you need to enable the tokio feature:

[dependencies]
elegant-departure = { version = "0.3", features = "tokio" }

Example

Examples can be found in the example directory:

  • Simple: simple example without tokio integration
  • Axum: Axum integration example
  • Tokio: Tokio integration example
  • Hyper: a shutdown example using the Hyper webserver
  • Worker: example implementation of a worker using select!
  • Smol: example using the smol runtime
  • Async Std: example using the async_std runtime

Minimal example using the tokio integration:

use std::time::Duration;

async fn worker(name: &'static str) {
    let guard = elegant_departure::get_shutdown_guard();

    println!("[{}] working", name);

    guard.wait().await;
    println!("[{}] shutting down", name);

    tokio::time::sleep(Duration::from_secs(1)).await;
    println!("[{}] done", name);
}

#[tokio::main]
async fn main() {
    tokio::spawn(worker("worker 1"));
    tokio::spawn(worker("worker 2"));

    elegant_departure::tokio::depart()
        // Shutdown on Ctrl+C and SIGTERM
        .on_termination()
        .await
}