1 个不稳定版本
0.1.0 | 2019年8月6日 |
---|
#7 in #ctrlc
6KB
69 行
使用 failure
和 futures
轻松处理 Ctrl+C。
在很多情况下,用户发出的 Ctrl+C 事件与致命的应用程序错误几乎没有区别。这个 crate 受 Python 的 InterruptedException
的启发,使得以这种方式处理 Ctrl+C 变得非常容易。
示例
use futures::prelude::*;
use tokio_ctrlc_error::AsyncCtrlc;
fn lengthy_task() -> impl Future<Item = (), Error = failure::Error> {
futures::future::ok(())
}
let task = lengthy_task().ctrlc_as_error();
let mut rt = tokio::runtime::Runtime::new().unwrap();
let res = rt.block_on(task);
println!("{:?}", res);
使用说明
ctrlc_as_error
与 select
具有相同的语义,将返回未来的结果或一个 KeyboardInterrupt
错误,哪个先发生就返回哪个。特别是,中断仅拦截 调用之前的那些链中的 future。例如
use std::time::Duration;
use futures::prelude::*;
use tokio_ctrlc_error::AsyncCtrlc;
fn sleep() -> impl Future<Item = (), Error = failure::Error> {
// The sleep is very short, so that the tests don't take too much time
tokio_timer::sleep(Duration::from_millis(1)).from_err()
}
let task = sleep()
.ctrlc_as_error()
.and_then(|_| sleep());
let mut rt = tokio::runtime::Runtime::new().unwrap();
let res = rt.block_on(task);
这里,中断只会在第一次睡眠时处理。在第二次睡眠期间,将执行默认的信号处理。
依赖项
~3MB
~48K SLoC