2个版本
使用旧的Rust 2015
0.1.1 | 2016年11月5日 |
---|---|
0.1.0 | 2016年3月15日 |
#12 in #shutdown-signal
7KB
50 行
Graceful
优雅关闭。
用法
查看simple.rs以获取一个简单的示例。
许可
Graceful主要在MIT许可和Apache许可(版本2.0)的条款下分发,部分由各种类似BSD的许可覆盖。
有关详细信息,请参阅LICENSE-APACHE和LICENSE-MIT。
lib.rs
:
优雅关闭。
(Unix) 异步信号难以正确处理。这个实用程序允许你阻塞主线程并执行任意(线程安全)的代码来优雅地关闭进程。
用法
- 在创建任何其他线程之前,初始化一个SignalGuard。
- 在初始化期间,SignalGuard将阻塞必要的信号(在*nix上为
SIGINT
、SIGQUIT
和SIGTERM
,在Windows上为Ctrl+C
和Ctrl+Break
)。 - 启动新线程以执行实际工作。
- 注册一个处理程序以正确关闭应用程序。
- 主线程将在接收到信号之前被阻塞。
- 处理程序将在主线程中运行。
- 在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