#tokio #async-io #io #compat #async #stdio #io-read

tokio-io-compat

围绕std io traits的兼容包装器,实现了tokio io traits

2个版本

0.1.1 2021年11月5日
0.1.0 2021年10月16日

#1150 in 异步

MIT 许可证

16KB
287 代码行

tokio-io-compat

GitHub Workflow Status crates.io Documentation

围绕 std::io::{Read, Write, Seek} traits的兼容包装器,实现了 tokio::io::{AsyncRead, AsyncWrite, AsyncSeek}.

注意:这不会神奇地使您的IO操作异步。您仍然可以考虑异步化代码或将IO操作移至阻塞线程,如果成本较高。

处理 WouldBlock

如果您尝试包装非阻塞IO,当数据未准备好时,它可能会产生 WouldBlock 错误。此包装器将自动将 WouldBlock 转换为 Poll::Pending.

然而,唤醒器必须在稍后唤醒,以避免阻塞未来。默认情况下,它立即唤醒。这可能会浪费过多的CPU周期,尤其是在操作缓慢时。

您可以通过使用 AsyncIoCompat::new_with_delay 在每次唤醒之前添加延迟来创建包装器。如果您的底层非阻塞IO具有本机poll完成通知机制,请考虑编写自己的包装器而不是使用此crate。

请参考 tokio-tls

示例

use std::io::Cursor;
use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt, SeekFrom};
use tokio_io_compat::CompatHelperTrait;

let mut data = Cursor::new(vec![]);
data.tokio_io_mut().write_all(&vec![0, 1, 2, 3, 4]).await.unwrap();
data.tokio_io_mut().seek(SeekFrom::Start(2)).await.unwrap();
assert_eq!(data.tokio_io_mut().read_u8().await.unwrap(), 2);

依赖项

~2–3MB
~46K SLoC