7 个版本
0.3.3 | 2021 年 11 月 1 日 |
---|---|
0.3.2 | 2021 年 6 月 10 日 |
0.3.1 | 2021 年 2 月 18 日 |
0.2.0 | 2021 年 1 月 1 日 |
0.1.0 | 2020 年 3 月 17 日 |
#147 在 异步
238,346 每月下载量
用于 410 个 Crates (8 直接)
30KB
517 行
async_io_stream
强化版的 IntoAsyncRead
此 crate 提供与 futures-util::IntoAsyncRead
相似的功能。它处理实现 Stream
和 Sink
的底层类型的 AsyncRead 和 AsyncWrite。该流需要是 TryStream
,它遍历 I: AsRef<u8>
和 std::io::Error
。该 Sink
必须是 I: From< Vec<u8> >
,并具有相同的错误。
主要其他区别在于,我们将始终尝试使用客户端提供的完整缓冲区。对于 poll_read
,如果 Stream
上有更多项目可用,我们将尝试通过使用多个消息来填充整个缓冲区。提供矢量化 io 的实现,以最大限度地使用所有缓冲区,与默认实现相比,默认实现只会考虑第一个缓冲区。
对于 Sink
,所有传入的数据都会被转换为 Sink
的一个项。
还实现了 AsyncBufRead
,可用于在读取时避免数据复制。
在对底层 Stream
进行多次轮询时,我们会发送一个虚拟唤醒器,以防止底层 Stream
在我们没有返回 Poll::Pending
时尝试唤醒任务。也就是说,如果我们已经有了要返回的数据,就不能返回 Poll::Pending
。如果底层 Stream
返回一个错误,我们将它缓冲到下一次轮询。
目录
安装
使用 cargo add: cargo add async_io_stream
使用 cargo yaml
dependencies:
async_io_stream: ^0.3
使用 Cargo.toml
[dependencies]
async_io_stream = "0.3"
升级
升级时,请查看 变更日志。
依赖
该crate只有少数依赖。Cargo会自动为您处理依赖。
可选地,使用 map_pharos
功能,将 Observable
特性重新实现并转发到内部类型。这允许带外错误处理,因为 AsyncRead
/AsyncWrite
只能返回 std::io::Error
,编解码器通常会在返回任何错误时停止处理传输。这允许通知客户端非致命错误或事件。
当启用 tokio_io
功能时,提供 tokio 的 AsyncRead
/AsyncWrite
特性的实现。
安全
此 crate 使用 #![ forbid(unsafe_code) ]
。缓冲区没有最大尺寸保护。由于我们从未解释过通过的数据,该 crate 未进行模糊测试。
使用
基本示例
use
{
async_io_stream :: { IoStream } ,
futures::io :: { AsyncWrite, AsyncRead } ,
futures :: { Stream, Sink } ,
std :: { io } ,
};
fn usage( transport: impl Stream< Item=Result<Vec<u8>, io::Error> > + Sink< Vec<u8>, Error=io::Error > + Unpin )
-> impl AsyncRead + AsyncWrite + Unpin
{
IoStream::new( transport )
}
API
API 文档可以在 docs.rs 上找到。
贡献
请查看 贡献指南。
测试
行为准则
在 公民行为准则的第4点“不可接受的行为”中描述的任何行为都是不受欢迎的,并可能导致您被禁止。如果任何包括项目维护者和管理员的任何人未能尊重这些/您的限制,您有权指出。
许可
依赖
~0.6–2MB
~35K SLoC