2个版本

使用旧的Rust 2015

0.1.1 2016年11月5日
0.1.0 2016年3月15日

#12 in #shutdown-signal

MIT/Apache

7KB
50

Graceful

优雅关闭。

构建状态 API文档

用法

查看simple.rs以获取一个简单的示例。

许可

Graceful主要在MIT许可和Apache许可(版本2.0)的条款下分发,部分由各种类似BSD的许可覆盖。

有关详细信息,请参阅LICENSE-APACHELICENSE-MIT


lib.rs:

优雅关闭。

(Unix) 异步信号难以正确处理。这个实用程序允许你阻塞主线程并执行任意(线程安全)的代码来优雅地关闭进程。

用法

  1. 在创建任何其他线程之前,初始化一个SignalGuard
  2. 在初始化期间,SignalGuard将阻塞必要的信号(在*nix上为SIGINTSIGQUITSIGTERM,在Windows上为Ctrl+CCtrl+Break)。
  3. 启动新线程以执行实际工作。
  4. 注册一个处理程序以正确关闭应用程序。
  5. 主线程将在接收到信号之前被阻塞。
  6. 处理程序将在主线程中运行。
  7. 在Windows上,处理程序返回(以及可能的任何libc atexit处理程序)后进程将终止。

示例

extern crate graceful;

use std::sync::atomic::{ATOMIC_BOOL_INIT, AtomicBool, Ordering};
use std::time::Duration;
use std::thread;

use graceful::SignalGuard;

static STOP: AtomicBool = ATOMIC_BOOL_INIT;

fn main() {
    let signal_guard = SignalGuard::new();

	let handle = thread::spawn(|| {
        println!("Worker thread started. Type Ctrl+C to stop.");
        while !STOP.load(Ordering::Acquire) {
            println!("working...");
            thread::sleep(Duration::from_millis(500));
        }
        println!("Bye.");
    });

	signal_guard.at_exit(move |sig| {
        println!("Signal {} received.", sig);
        STOP.store(true, Ordering::Release);
        handle.join().unwrap();
    });
}

依赖关系

~2MB
~39K SLoC