#shutdown-signal #exit #branch #running #gracefully #part #tokio

构建 shutdown

shutdown 可以用于优雅地退出(部分)运行中的程序

8 个版本

0.4.1 2024年7月5日
0.4.0 2024年7月4日
0.3.1 2023年9月26日
0.2.1 2021年12月14日
0.1.1 2020年12月1日

#234构建实用工具

Download history 61/week @ 2024-04-29 145/week @ 2024-05-06 201/week @ 2024-05-13 188/week @ 2024-05-20 375/week @ 2024-05-27 96/week @ 2024-06-03 111/week @ 2024-06-10 188/week @ 2024-06-17 222/week @ 2024-06-24 365/week @ 2024-07-01 244/week @ 2024-07-08 170/week @ 2024-07-15 108/week @ 2024-07-22 41/week @ 2024-07-29 142/week @ 2024-08-05 134/week @ 2024-08-12

429 每月下载量
用于 blobnet

MIT/Apache

17KB
185

shutdown

shutdown 可以用于优雅地退出(部分)运行中的程序

Build Status Crates.io Documentation License

示例

以下示例展示了如何创建一个新的关机对象,创建一些分支,订阅一些监听器并信号一个分支

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

用法

将 shutdown 和 Tokio 添加到你的依赖项中

shutdown = "0.4"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

然后在你的 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...
            }
        })
    }
}

运行测试

因为每个 "根" 关机对象都会注册自己以监听 SIGINT 和 SIGTERM 信号,所以测试需要逐个运行。因此,要运行测试,请执行

$ cargo test -- --test-threads=1

贡献

欢迎和感谢拉取请求和问题!

许可证

shutdown 在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发

依赖项

~4–12MB
~118K SLoC