#pipe #error #reader-writer #io

fused-reader

此包提供了融合阅读器类型,如果在写入线程持有已启动的融合时该线程死亡,则读取器将收到 BrokenPipe 错误

1 个不稳定版本

0.1.0 2019年8月28日

#676 in 并发

MIT 许可证

11KB
128

Latest Version Documentation License

当与数据管道一起工作时,通常需要区分由写入线程完成写入而导致的读取端 EOF 和写入线程恐慌的情况。此包提供了融合阅读器类型,如果在写入线程持有已启动的融合时该线程死亡,则读取器将收到 BrokenPipe 错误。

还可以使用传递给读取端的自定义错误来引爆融合。

示例使用

写入器崩溃,读取器收到 BrokenPipe 错误。

use pipe::pipe;
use fused_reader::fuse;
use std::io::{Read, Write, ErrorKind};
use std::thread;

let (reader, mut writer) = pipe();
let (mut reader, fuse) = fuse(reader);

thread::spawn(move || {
	let _fuse = fuse.arm().unwrap();
	writer.write(&[1]).unwrap();
	panic!("boom");
});

let mut data = Vec::new();

assert_eq!(reader.read_to_end(&mut data).unwrap_err().kind(), ErrorKind::BrokenPipe);
assert_eq!(&data, &[1]); // data that was written before panic

写入器失败并传递错误给读取器。

use pipe::pipe;
use fused_reader::fuse;
use std::io::{Read, Write, Error as IoError, ErrorKind};
use std::thread;

let (reader, mut writer) = pipe();
let (mut reader, fuse) = fuse(reader);

thread::spawn(move || {
	let fuse = fuse.arm().unwrap();
	writer.write(&[1]).unwrap();
	fuse.blow(IoError::new(ErrorKind::UnexpectedEof, "uh! oh!"))
});

let mut data = Vec::new();

assert_eq!(reader.read_to_end(&mut data).unwrap_err().kind(), ErrorKind::UnexpectedEof);
assert_eq!(&data, &[1]); // data that was written before error

无运行时依赖