Крейт async_io
Источник: Документация async_io
Асинхронный ввод-вывод и таймеры.
Описание
Этот крейт предоставляет два основных инструмента:
Async- адаптер для стандартных сетевых типов (и многих других типов) для использования в асинхронных программах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: Для внутренней синхронизации
Производительность
- Эффективное пробуждение: Точечное пробуждение только нужных фьючерсов
- Минимальные накладные расходы: Легковесная реализация
- Масштабируемость: Поддержка большого количества одновременных операций