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
8,895 monthly downloads
在 9 crates 中使用 (8 directly)
20KB
260 代码行数(不包括注释)
timeout-readwrite
一个Rust库,提供超时功能的Reader和Writer结构体。
为什么在异步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