기사 디렉토리
개요
미래-IO는 주로이 라이브러리를 포함하는 AsyncRead
, AsyncWrite
, AsyncSeek
, AsyncBufRead
형질 동기화 표준 라이브러리에 대응하는 std::io::{Read, Write, Seek, BufRead}
, 가장 큰 차이점은 비동기 시스템 함께 형질이다.
AsyncRead
비동기 적으로 바이트를 읽습니다. 유사 std::io::Read
하고 poll_read
다른 Read::read
현재 작업이 실행기 실행 대기열에 추가되고 깨우기를 기다린 다음 호출 스레드를 차단하는 대신 데이터를 아직 사용할 수 없을 때 반환됩니다.
pub trait AsyncRead {
#[cfg(feature = "read-initializer")]
#[inline]
unsafe fn initializer(&self) -> Initializer {
Initializer::zeroing()
}
/// 尝试从对象中读取数据到buf
/// 成功,则返回`Poll::Ready(Ok(num_bytes_read))`
/// 如果没有数据可读取,则返回`Poll::Pending` 并安排当前任务(via `cx.waker().wake_by_ref()`)在可读或关闭时接收通知
fn poll_read(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8])
-> Poll<Result<usize>>;
fn poll_read_vectored(self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &mut [IoSliceMut<'_>])
-> Poll<Result<usize>>
{
for b in bufs {
if !b.is_empty() {
return self.poll_read(cx, b);
}
}
self.poll_read(cx, &mut [])
}
}
AsyncWrite
비동기 적으로 바이트를 씁니다. 유사 std::io::Write
하고 poll_write
다른 Write::write
현재 작업이 실행기 실행 대기열에 추가되고 깨우기를 기다린 다음 호출 스레드를 차단하는 대신 데이터를 아직 사용할 수 없을 때 반환됩니다.
pub trait AsyncWrite {
/// 尝试将buf中的字节写入到AsyncWrite
/// 成功,则返回`Poll::Ready(Ok(num_bytes_written))`
/// 如果对象尚未准备好写,则返回`Poll::Pending` 并安排当前任务(via `cx.waker().wake_by_ref()`)在可写或关闭时接收通知
fn poll_write(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8])
-> Poll<Result<usize>>;
fn poll_write_vectored(self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &[IoSlice<'_>])
-> Poll<Result<usize>>
{
for b in bufs {
if !b.is_empty() {
return self.poll_write(cx, b);
}
}
self.poll_write(cx, &[])
}
/// 尝试刷新对象,确保所有的数据到达目的地
/// 成功,则返回`Poll::Ready(Ok(()))`
/// 如果无法立即完成刷新,则返回`Poll::Pending` 并安排当前任务(via `cx.waker().wake_by_ref()`)在对象可以进行刷新时接收通知
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>>;
/// 尝试关闭对象
/// 如果成功,则返回`Poll::Ready(Ok(()))`
/// 如果无法立即关闭,则返回`Poll::Pending` 并安排当前任务(via `cx.waker().wake_by_ref()`)在对象可以关闭时接收通知
fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<()>>;
}
AsyncSeek
비동기 적으로 바이트를 찾습니다. 유사 std::io::Seek
하고 poll_seek
다른 Seek::seek
현재 작업이 실행기 실행 대기열에 추가되고 깨우기를 기다린 다음 호출 스레드를 차단하는 대신 데이터를 아직 사용할 수 없을 때 반환됩니다.
pub trait AsyncSeek {
/// Attempt to seek to an offset, in bytes, in a stream.
/// 尝试在流中查找以字节为单位的偏移量
/// 允许在流的末端进行查找,但行为由实现定义
/// 如果seek操作成功完成,从流的开头返回新的位置,该位置以后可以与[`SeekFrom::Start`]一起使用
/// 查找负偏移量被视作是错误
fn poll_seek(self: Pin<&mut Self>, cx: &mut Context<'_>, pos: SeekFrom)
-> Poll<Result<u64>>;
}
AsyncBufRead
비동기 적으로 바이트를 읽습니다. 마찬가지로 std::io::BufRead
, poll_fill_buf
데이터가 대신 호출 스레드를 차단 아직 사용할 수없는 경우 BufRead :: fill_buf```다른, 현재 작업은 웨이크 업 및 반환을위한 실행 프로그램 실행 큐 대기에 추가됩니다.
pub trait AsyncBufRead: AsyncRead {
/// 尝试返回内部缓冲区内容,如果内部缓冲区为空,则用内部reader的更多数据填充它
/// 如果成功则返回`Poll::Ready(Ok(buf))`
/// 如果没有数据可读取,则返回`Poll::Pending` 并安排当前任务(via `cx.waker().wake_by_ref()`)在可读或关闭时接收通知
/// 这个函数一个低级别的调用,通常与consume方法配合才能正常运行
/// 调用此方法时,任何内容都不会被“read”,因为稍后调用[`poll_read`]可能会返回相同的内容。因此,必须使用从此缓冲区消耗的字节数来调用[`consume`],以确保字节永远不会返回两次。
/// 返回空缓冲区,则表示流已到达EOF
fn poll_fill_buf(self: Pin<&mut Self>, cx: &mut Context<'_>)
-> Poll<Result<&[u8]>>;
/// 告诉此缓冲区,“amt”字节已从缓冲区中消耗掉,因此在调用[`poll_read`]时不再应返回它们。
/// 这个函数一个低级别的调用,通常与poll_fill_buf方法配合才能正常运行
/// 此函数不执行任何I/O,只是通知此对象其缓冲区有一定数据,
/// 从[`poll_fill_buf`]返回的内容已被使用,不应再返回。
/// 因此,如果在调用[poll_fill_buf]之前未对其进行调用,则此函数可能会做一些奇怪的事情。
/// [`poll_read`]: AsyncRead::poll_read
/// [`poll_fill_buf`]: AsyncBufRead::poll_fill_buf
fn consume(self: Pin<&mut Self>, amt: usize);
}