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_io

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

Асинхронный ввод-вывод и таймеры.

Описание

Этот крейт предоставляет два основных инструмента:

  1. Async - адаптер для стандартных сетевых типов (и многих других типов) для использования в асинхронных программах
  2. Timer - фьючерс или поток, который эмитирует события по времени

Для конкретных асинхронных сетевых типов, построенных на основе этого крейта, см. async-net.

Реализация

При первом использовании Async или Timer создается поток с именем "async-io". Цель этого потока - ожидать события ввода-вывода, о которых сообщает операционная система, а затем пробуждать соответствующие фьючерсы, заблокированные на операциях ввода-вывода или таймерах, когда их можно возобновить.

Для ожидания следующего события ввода-вывода поток "async-io" использует:

  • epoll на Linux/Android/illumos
  • kqueue на macOS/iOS/BSD
  • event ports на illumos/Solaris
  • IOCP на Windows

Эта функциональность предоставляется крейтом polling.

Однако обратите внимание, что вы также можете обрабатывать события ввода-вывода и пробуждать фьючерсы на любом потоке с помощью функции block_on(). Таким образом, поток "async-io" является лишь резервным механизмом обработки событий ввода-вывода на случай, если других потоков нет.

Примеры

Подключение к example.com:80 с таймаутом 10 секунд:

#![allow(unused)]
fn main() {
use async_io::{Async, Timer};
use futures_lite::{future::FutureExt, io};

use std::net::{TcpStream, ToSocketAddrs};
use std::time::Duration;

let addr = "example.com:80".to_socket_addrs()?.next().unwrap();

let stream = Async::<TcpStream>::connect(addr).or(async {
    Timer::after(Duration::from_secs(10)).await;
    Err(io::ErrorKind::TimedOut.into())
})
.await?;
}

Модули

МодульОписание
osПлатформо-специфичная функциональность

Структуры

СтруктураОписание
AsyncАсинхронный адаптер для I/O типов
ReadableФьючерс для Async::readable
ReadableOwnedФьючерс для Async::readable_owned
TimerФьючерс или поток, который эмитирует события по времени
WritableФьючерс для Async::writable
WritableOwnedФьючерс для Async::writable_owned

Трейты

ТрейтОписание
IoSafeТипы, реализации I/O трейтов которых не удаляют базовый I/O источник

Функции

ФункцияОписание
block_onБлокирует текущий поток на фьючерсе, обрабатывая I/O события в простое

Ключевые особенности

Архитектура

  • Фоновый поток: "async-io" поток для обработки событий
  • Кросс-платформенность: Единый API для разных операционных систем
  • Резервный механизм: Основная обработка может происходить в любом потоке

Использование Async адаптера

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

// Создание асинхронного TCP-соединения
let stream = Async::<TcpStream>::connect("example.com:80").await?;
}

Использование таймеров

#![allow(unused)]
fn main() {
use async_io::Timer;
use std::time::Duration;

// Ожидание 1 секунды
Timer::after(Duration::from_secs(1)).await;

// Периодический таймер
let mut interval = Timer::interval(Duration::from_secs(1));
while interval.next().await.is_some() {
    println!("Прошла 1 секунда");
}
}

Зависимости

  • polling: Для кросс-платформенного опроса событий ввода-вывода
  • futures-lite: Для асинхронных примитивов и комбинаторов
  • concurrent-queue: Для внутренней синхронизации

Производительность

  • Эффективное пробуждение: Точечное пробуждение только нужных фьючерсов
  • Минимальные накладные расходы: Легковесная реализация
  • Масштабируемость: Поддержка большого количества одновременных операций