2个版本
0.1.1 | 2021年11月5日 |
---|---|
0.1.0 | 2021年10月16日 |
#1150 in 异步
16KB
287 代码行
tokio-io-compat
围绕 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