Spec-Zone.ru › Tokio

Трейт AsyncRead

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 &[u8]

fn poll_read( self: Pin<&mut Self>, _cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<Result<()>>

impl<P> AsyncRead for Pin<P>
where P: DerefMut, P::Target: AsyncRead,

fn poll_read( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<Result<()>>

impl<T: ?Sized + AsyncRead + Unpin> AsyncRead for &mut T

fn poll_read( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<Result<()>>

impl<T: ?Sized + AsyncRead + Unpin> AsyncRead for Box<T>

fn poll_read( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<Result<()>>

impl<T: AsRef<[u8]> + Unpin> AsyncRead for Cursor<T>

fn poll_read( self: Pin<&mut Self>, _cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<Result<()>>

Реализаторы

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

Доступно только в Windows при включённой функции крейта net.

impl AsyncRead for NamedPipeServer

Доступно только в Windows при включённой функции крейта net.

impl AsyncRead for tokio::net::tcp::OwnedReadHalf

Доступно только при включённой функции крейта net.

impl AsyncRead for tokio::net::unix::OwnedReadHalf

Доступно только в Unix при включённой функции крейта net.

impl AsyncRead for tokio::net::tcp::ReadHalf<'_>

Доступно только при включённой функции крейта net.

impl AsyncRead for tokio::net::unix::ReadHalf<'_>

Доступно только в Unix при включённой функции крейта net.

impl AsyncRead for Receiver

Доступно только в Unix при включённой функции крейта 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

Доступно только в Unix при включённой функции крейта 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>
where T: AsyncRead, U: AsyncRead,

Доступно только при включённой функции крейта 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API