1 个不稳定版本
0.1.0 | 2019年8月28日 |
---|
#676 in 并发
11KB
128 行
当与数据管道一起工作时,通常需要区分由写入线程完成写入而导致的读取端 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