#ctrl-c #interrupt #tokio #keyboard

tokio-ctrlc-error

使用 tokio 轻松处理键盘中断

1 个不稳定版本

0.1.0 2019年8月6日

#7 in #ctrlc

AGPL-3.0

6KB
69

使用 failurefutures 轻松处理 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_errorselect 具有相同的语义,将返回未来的结果或一个 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