7 个版本

使用旧的 Rust 2015

0.3.3 2023年1月11日
0.3.2 2022年7月19日
0.3.1 2020年3月3日
0.3.0 2020年1月28日
0.1.0 2017年9月6日

#186 in Unix APIs

Download history 2950/week @ 2024-04-07 2198/week @ 2024-04-14 2505/week @ 2024-04-21 2535/week @ 2024-04-28 1658/week @ 2024-05-05 3067/week @ 2024-05-12 2424/week @ 2024-05-19 2439/week @ 2024-05-26 3238/week @ 2024-06-02 2236/week @ 2024-06-09 2453/week @ 2024-06-16 1735/week @ 2024-06-23 2276/week @ 2024-06-30 2578/week @ 2024-07-07 2498/week @ 2024-07-14 1477/week @ 2024-07-21

8,895 monthly downloads
9 crates 中使用 (8 directly)

MIT/Apache

20KB
260 代码行数(不包括注释)

timeout-readwrite

一个Rust库,提供超时功能的Reader和Writer结构体。

Build Status

为什么在异步I/O中有这个功能是有用的?以你与后台子进程交互的例子来说明,这个子进程正在等待某个事件发生,当它发生时,会向标准输出输出一条消息。你的程序正在等待从子进程的标准输出流接收输入。你可能想编写如下代码,对每行输入执行一些有趣的操作,但你并不介意在下一行到来之前阻塞。

use std::io::{BufRead, BufReader};
use std::io::Result;
use std::process;

fn each_line<R: BufRead>(rdr: R) -> Result<()> {
    let lines = rdr.lines();

    for rslt_line in lines {
        let line = rslt_line?;
        println!("{}", line);
    }
    Ok(())
}

fn do_command(cmd: &str) -> Result<()> {
    let mut cmd = process::Command::new(cmd);
    let child = cmd.stdout(process::Stdio::piped())
        .stderr(process::Stdio::null())
        .spawn().expect("spawning did not succeed");

    let stdout = child.stdout?;
    each_line(BufReader::new(stdout))
}

只要生成的进程不会挂起并且以合理的速度提供输出,它就会正常工作。但是,如果生成的进程挂起了,那么你的程序将永远阻塞,等待另一行出现。理想情况下,我们希望能够对读取操作进行超时,并在发生这种情况时返回错误。因此,我们有一个TimeoutReader结构体来提供这种能力。有了这个,我们可以将我们的do_command函数修改如下:

use std::time::Duration;

fn do_command(cmd: &str) -> Result<()> {
    let mut cmd = process::Command::new(cmd);
    let child = cmd.stdout(process::Stdio::piped())
        .stderr(process::Stdio::null())
        .spawn().expect("spawning did not succeed");

    let stdout = child.stdout?;
    each_line(BufReader::new(TimeoutReader::new(stdout, Duration::new(5, 0))))
}

现在,如果程序必须在5秒内等待而没有从子进程接收数据,那么Lines迭代器后面的读取调用将因超时而失败,并返回一个ErrorKind::TimeOut错误。

文档

模块文档及示例

使用方法

将以下内容添加到您的Cargo.toml

[dependencies]
timeout-readwrite = "0.3.1"

并将以下内容添加到您的crate根目录

extern crate timeout_readwrite;

依赖项

~1.5MB
~35K SLoC