Трейт Async Read
pub trait AsyncRead {
// Required method
fn poll_read(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
buf: &mut ReadBuf<'_>,
) -> Poll<Result<()>>;
}
Читает байты из источника.
Этот трейт аналогичен трейту std::io::Read, но интегрируется с системой асинхронных задач. В частности, метод poll_read, в отличие от Read::read, автоматически поставит текущую задачу в очередь на пробуждение и вернёт управление, если данные ещё недоступны, вместо того чтобы блокировать вызывающий поток.
В частности, это означает, что функция poll_read вернёт один из следующих результатов:
-
Poll::Ready(Ok(()))означает, что данные были немедленно прочитаны и помещены в выходной буфер. Объём прочитанных данных можно определить по увеличению длины среза, возвращённого методомReadBuf::filled. Если разница равна 0, значит, достигнут конец файла (EOF) или выходной буфер имеет нулевую ёмкость (то естьbuf.remaining()== 0). -
Poll::Pendingозначает, что в предоставленный буфер не было прочитано ни одного байта. Объект ввода-вывода в данный момент недоступен для чтения, но может стать доступен в будущем. Важно отметить, что задача текущего future запланирована к разблокировке, когда объект станет доступен для чтения. Это означает, что, как и в случае сFuture::poll, вы получите уведомление, когда объект ввода-вывода снова станет доступен для чтения. -
Poll::Ready(Err(e))для других ошибок — это стандартные ошибки ввода-вывода, возникающие в базовом объекте.
Важно, что этот трейт означает: метод read работает только в контексте задачи future. При использовании вне задачи объект может вызвать панику.
Утилиты для работы со значениями AsyncRead предоставляет AsyncReadExt.
Обязательные методы
fn poll_read( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<Result<()>>
Пытается прочитать данные из AsyncRead в buf.
При успехе возвращает Poll::Ready(Ok(())) и помещает данные в незаполненную часть buf. Если данные не были прочитаны (buf.filled().len() не изменился), это означает, что достигнут конец файла (EOF) или выходной буфер имеет нулевую ёмкость (то есть buf.remaining() == 0).
Если данные для чтения недоступны, метод возвращает Poll::Pending и организует получение текущей задачей (через cx.waker()) уведомления, когда объект станет доступен для чтения или будет закрыт.
Совместимость с dyn
Этот трейт совместим с dyn.
В более ранних версиях Rust совместимость с dyn называлась «безопасностью объектов».
Реализации для сторонних типов
Реализаторы
impl AsyncRead for ChildStderr
process.impl AsyncRead for ChildStdout
process.impl AsyncRead for DuplexStream
io-util.impl AsyncRead for Empty
io-util.impl AsyncRead for File
fs.impl AsyncRead for NamedPipeClient
net.impl AsyncRead for NamedPipeServer
net.impl AsyncRead for tokio::net::tcp::OwnedReadHalf
net.impl AsyncRead for tokio::net::unix::OwnedReadHalf
net.impl AsyncRead for tokio::net::tcp::ReadHalf<'_>
net.impl AsyncRead for tokio::net::unix::ReadHalf<'_>
net.impl AsyncRead for Receiver
net.impl AsyncRead for Repeat
io-util.impl AsyncRead for SimplexStream
io-util.impl AsyncRead for Stdin
io-std.impl AsyncRead for TcpStream
net.impl AsyncRead for UnixStream
net.impl<R, W> AsyncRead for Join<R, W>where R: AsyncRead,
io-util.impl<R: AsyncRead> AsyncRead for BufReader<R>
io-util.impl<R: AsyncRead> AsyncRead for Take<R>
io-util.impl<RW: AsyncRead + AsyncWrite> AsyncRead for BufStream<RW>
io-util.impl<T, U> AsyncRead for Chain<T, U>
io-util.impl<T: AsyncRead> AsyncRead for tokio::io::ReadHalf<T>
io-util.impl<W: AsyncWrite + AsyncRead> AsyncRead for BufWriter<W>
io-util.
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/io/trait.AsyncRead.html