Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Структура Async

Источник: Документация smol::Async

#![allow(unused)]
fn main() {
pub struct Async<T> { /* private fields */ }
}

Асинхронный адаптер для I/O типов.

Этот тип переводит I/O дескриптор в неблокирующий режим, регистрирует его в epoll/kqueue/event ports/IOCP и предоставляет асинхронный интерфейс для работы с ним.

Особенности

Async является низкоуровневым примитивом и имеет некоторые ограничения:

  • Для более высокоуровневых примитивов, построенных на основе Async, используйте async-net или async-process (на Unix)
  • Небезопасно обращаться к внутреннему I/O источнику изменяемо с помощью этого примитива
  • Трейты AsyncRead и AsyncWrite не реализованы по умолчанию, если не гарантировано, что ресурс не будет инвалидирован при чтении или записи

Поддерживаемые типы

Async поддерживает все сетевые типы, а также некоторые OS-специфичные файловые дескрипторы, такие как timerfd и inotify.

Не используйте Async с типами типа File, Stdin, Stdout или Stderr, поскольку все операционные системы имеют проблемы с ними в неблокирующем режиме.

Конкурентный I/O

&Async<T> реализует AsyncRead и AsyncWrite, если &T реализует эти трейты, что означает, что задачи могут конкурентно читать и писать с использованием общих ссылок.

Важно: только одна задача может читать за раз и только одна задача может писать за раз. Допустимо иметь две задачи, где одна читает, а другая пишет одновременно, но недопустимо иметь две задачи, читающие одновременно или пишущие одновременно.

Закрытие

Закрытие стороны записи Async с помощью close() просто выполняет сброс. Если вы хотите завершить работу TCP или Unix сокета, используйте Shutdown.

Примеры

Подключение к серверу и возврат входящих сообщений обратно на сервер:

#![allow(unused)]
fn main() {
use async_io::Async;
use futures_lite::io;
use std::net::TcpStream;

// Подключаемся к локальному серверу.
let stream = Async::<TcpStream>::connect(([127, 0, 0, 1], 8000)).await?;

// Копируем все сообщения из стороны чтения потока в сторону записи.
io::copy(&stream, &stream).await?;
}

Реализации

Источник: Документация smol::Async

Конструкторы

МетодСигнатураОписание
newpub fn new(io: T) -> Result<Async<T>>Создает новый асинхронный I/O дескриптор

Методы доступа

МетодСигнатураОписание
get_refpub fn get_ref(&self) -> &TПолучает ссылку на внутренний дескриптор
get_mutpub fn get_mut(&mut self) -> &mut TПолучает изменяемую ссылку на внутренний дескриптор
into_innerpub fn into_inner(self) -> Result<T>Извлекает внутренний дескриптор

Методы для чтения/записи

МетодСигнатураОписание
read_withpub fn read_with<R>(&self, op: impl FnOnce(&T) -> Result<R>) -> impl Future<Output = Result<R>>Выполняет блокирующую операцию чтения асинхронно
read_with_mutpub fn read_with_mut<R>(&self, op: impl FnOnce(&mut T) -> Result<R>) -> impl Future<Output = Result<R>>Выполняет блокирующую операцию чтения с изменяемым доступом
write_withpub fn write_with<R>(&self, op: impl FnOnce(&T) -> Result<R>) -> impl Future<Output = Result<R>>Выполняет блокирующую операцию записи асинхронно
write_with_mutpub fn write_with_mut<R>(&self, op: impl FnOnce(&mut T) -> Result<R>) -> impl Future<Output = Result<R>>Выполняет блокирующую операцию записи с изменяемым доступом

Методы доступности

МетодСигнатураОписание
readablepub fn readable(&self) -> Readable<'_, T>Создает фьючерс для ожидания доступности для чтения
writablepub fn writable(&self) -> Writable<'_, T>Создает фьючерс для ожидания доступности для записи
poll_readablepub fn poll_readable(&self, cx: &mut Context<'_>) -> Poll<Result<()>>Опрашивает доступность для чтения
poll_writablepub fn poll_writable(&self, cx: &mut Context<'_>) -> Poll<Result<()>>Опрашивает доступность для записи

Сетевые методы (для TcpStream)

МетодСигнатураОписание
connectpub async fn connect(addr: impl ToSocketAddrs) -> Result<Async<TcpStream>>Асинхронно подключается к адресу
peer_addrpub fn peer_addr(&self) -> Result<SocketAddr>Возвращает адрес удаленного peer
local_addrpub fn local_addr(&self) -> Result<SocketAddr>Возвращает локальный адрес
shutdownpub fn shutdown(&self, how: Shutdown) -> Result<()>Завершает часть соединения

Сетевые методы (для TcpListener)

МетодСигнатураОписание
bindpub fn bind(addr: impl ToSocketAddrs) -> Result<Async<TcpListener>>Привязывает сокет к адресу
acceptpub async fn accept(&self) -> Result<(Async<TcpStream>, SocketAddr)>Асинхронно принимает входящее подключение
local_addrpub fn local_addr(&self) -> Result<SocketAddr>Возвращает локальный адрес

Сетевые методы (для UdpSocket)

МетодСигнатураОписание
bindpub fn bind(addr: impl ToSocketAddrs) -> Result<Async<UdpSocket>>Привязывает UDP сокет к адресу
connectpub async fn connect(&self, addr: impl ToSocketAddrs) -> Result<()>Подключает UDP сокет к адресу
sendpub async fn send(&self, buf: &[u8]) -> Result<usize>Отправляет данные в подключенный адрес
recvpub async fn recv(&self, buf: &mut [u8]) -> Result<usize>Получает данные из подключенного адреса
send_topub async fn send_to(&self, buf: &[u8], addr: impl ToSocketAddrs) -> Result<usize>Отправляет данные на указанный адрес
recv_frompub async fn recv_from(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr)>Получает данные и адрес отправителя
local_addrpub fn local_addr(&self) -> Result<SocketAddr>Возвращает локальный адрес
peer_addrpub fn peer_addr(&self) -> Result<SocketAddr>Возвращает адрес удаленного peer

Трейты

Реализации From

ТрейтОписание
From<Async<T>>Преобразование в внутренний тип

Реализации для трейтов асинхронного I/O

ТрейтМетодыОписание
AsyncReadpoll_readАсинхронное чтение данных
AsyncWritepoll_write, poll_flush, poll_closeАсинхронная запись данных
AsyncBufReadpoll_fill_buf, consumeАсинхронное буферизованное чтение
AsyncSeekpoll_seekАсинхронное перемещение по потоку

Другие трейты

ТрейтОписание
DebugОтладочное представление
CloneКлонирование (если T: Clone)
AsRef<T>Получение ссылки на внутренний тип
AsMut<T>Получение изменяемой ссылки на внутренний тип

Зависимости

Структура Async зависит от следующих трейтов и типов:

  • std::io::Result, std::io::Error
  • std::net::ToSocketAddrs, SocketAddr
  • std::net::{TcpStream, TcpListener, UdpSocket}
  • std::future::Future
  • std::task::{Context, Poll}
  • futures_io::{AsyncRead, AsyncWrite, AsyncBufRead, AsyncSeek}
  • std::fmt::Debug
  • std::clone::Clone

Вспомогательные типы

ТипОписание
Readable<'a, T>Фьючерс для ожидания доступности чтения
Writable<'a, T>Фьючерс для ожидания доступности записи