Трейт Async BufRead
pub trait AsyncBufRead: AsyncRead {
// Required methods
fn poll_fill_buf(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Result<&[u8]>>;
fn consume(self: Pin<&mut Self>, amt: usize);
}
Асинхронно считывает байты.
Этот трейт аналогичен std::io::BufRead, но интегрируется с системой асинхронных задач. В частности, метод poll_fill_buf, в отличие от BufRead::fill_buf, автоматически ставит текущую задачу в очередь на пробуждение и возвращает управление, если данные ещё недоступны, вместо того чтобы блокировать вызывающий поток.
Утилиты для работы со значениями AsyncBufRead предоставляются трейтам AsyncBufReadExt.
Обязательные методы
fn poll_fill_buf( self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Result<&[u8]>>
Пытается вернуть содержимое внутреннего буфера, заполняя его дополнительными данными из внутреннего средства чтения, если буфер пуст.
В случае успеха возвращает Poll::Ready(Ok(buf)).
Если данные для чтения недоступны, метод возвращает Poll::Pending и организует уведомление текущей задачи (через cx.waker().wake_by_ref()), когда объект станет доступен для чтения или будет закрыт.
Эта функция представляет собой низкоуровневый вызов. Для правильной работы её необходимо использовать вместе с методом consume. При вызове этого метода содержимое не считается «прочитанным»: последующий вызов poll_read может вернуть то же содержимое. Поэтому необходимо вызвать consume, указав количество байтов, потреблённых из этого буфера, чтобы байты не возвращались повторно.
Пустой возвращённый буфер указывает на то, что поток достиг EOF.
fn consume(self: Pin<&mut Self>, amt: usize)
Сообщает этому буферу, что из него было потреблено amt байт, поэтому их больше не следует возвращать при вызовах poll_read.
Эта функция представляет собой низкоуровневый вызов. Для правильной работы её необходимо использовать вместе с методом poll_fill_buf. Функция не выполняет ввод-вывод, а лишь сообщает этому объекту, что некоторое количество байтов из его буфера, возвращённого методом poll_fill_buf, было потреблено и больше не должно возвращаться. Поэтому эта функция может вести себя неожиданно, если перед её вызовом не был вызван метод poll_fill_buf.
Значение amt должно быть <= количества байтов в буфере, возвращённом методом poll_fill_buf.
Совместимость с dyn
Этот трейт является совместимым с dyn.
В более старых версиях Rust совместимость с dyn называлась «безопасностью объектов».
Реализации для сторонних типов
impl AsyncBufRead for &[u8]
impl<P> AsyncBufRead for Pin<P>
impl<T: ?Sized + AsyncBufRead + Unpin> AsyncBufRead for &mut T
impl<T: ?Sized + AsyncBufRead + Unpin> AsyncBufRead for Box<T>
impl<T: AsRef<[u8]> + Unpin> AsyncBufRead for Cursor<T>
Реализаторы
impl AsyncBufRead for Empty
io-util.impl<R, W> AsyncBufRead for Join<R, W>where R: AsyncBufRead,
io-util.impl<R: AsyncBufRead> AsyncBufRead for Take<R>
io-util.impl<R: AsyncRead> AsyncBufRead for BufReader<R>
io-util.impl<RW: AsyncRead + AsyncWrite> AsyncBufRead for BufStream<RW>
io-util.impl<T, U> AsyncBufRead for Chain<T, U>where T: AsyncBufRead, U: AsyncBufRead,
io-util.impl<W: AsyncWrite + AsyncBufRead> AsyncBufRead for BufWriter<W>
io-util.
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/io/trait.AsyncBufRead.html