Crates.io | shutdown |
lib.rs | shutdown |
version | 0.4.1 |
source | src |
created_at | 2020-12-01 18:18:02.269646 |
updated_at | 2024-07-05 07:56:03.219439 |
description | shutdown can be used to gracefully exit (part of) a running program |
homepage | https://github.com/svanharmelen/shutdown |
repository | https://github.com/svanharmelen/shutdown |
max_upload_size | |
id | 318667 |
size | 30,176 |
shutdown can be used to gracefully exit (part of) a running program
The example below shows how to create a new shutdown object, create a few branches, subscribe some listeners and signal one of the branches:
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();
// Signal the first branch.
branch1.signal();
}
Add shutdown and Tokio to your dependencies:
shutdown = "0.4"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
And then get started in your main.rs
:
use shutdown::Shutdown;
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
let mut root = Shutdown::new().unwrap();
while !root.is_signalled() {
// Wait for a task to finish while also
// listening for any shutdown signals.
tokio::select! {
_ = sleep(Duration::from_secs(30)) => (),
_ = root.received() => break,
}
// Subscribe and spawn a long running task which will
// end its loop when a shutdown signal is received.
let shutdown = root.subscribe();
tokio::spawn(async move {
while !shutdown.is_signalled() {
// Do stuff until we're shutdown...
}
})
}
}
Because each "root" shutdown object registers itself to listen for SIGINT and SIGTERM signals, the test need to run one by one. So to run the tests, please execute:
$ 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)