shutdown can be used to gracefully exit (part of) a running program
The example below shows how to create a new shutdown channel, create a few branches, subscribe some listeners and shutdown one of the branches:
```rust use shutdown::Shutdown;
fn main() { let root = Shutdown::new().unwrap();
// Create two new branches.
let branch1 = root.branch();
let branch2 = root.branch();
// Create two new subscribers to the first branch.
let subscriber1 = branch1.subscribe();
let subscriber2 = branch1.subscribe();
// Shutdown the first branch.
branch1.shutdown();
} ```
Add shutdown and Tokio to your dependencies:
toml
shutdown = "0.1"
tokio = { version = "1", features = ["full"] }
And then get started in your main.rs
:
```rust use shutdown::Shutdown; use tokio::time::{sleep, Duration};
async fn main() { let mut root = Shutdown::new().unwrap();
while !root.is_shutdown() {
// Wait for a second before spawning a new task
tokio::select! {
_ = root.recv() => break,
_ = sleep(Duration::from_secs(1)) => (),
}
// Subscribe and spawn a long running task
let shutdown = root.subscribe();
tokio::spawn(async move {
while !shutdown.is_shutdown() {
// Do stuff until we're shutdown...
}
})
}
} ```
Because each "root" shutdown channel registers itself to listen for SIGINT and SIGTERM signals, the test need to run one by one. So to run the tests, please execute:
sh
$ cargo test -- --test-threads=1
Pull requests and issues are always welcome and appreciated!
shutdown is distributed under the terms of both the MIT license and the Apache License (Version 2.0)