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