Крейт channel
Источник: Документация async-channel
Асинхронный многопоточный канал, где каждое сообщение может быть получено только одним из всех существующих потребителей.
Типы каналов
Существует два вида каналов:
- Ограниченный канал (bounded) с ограниченной емкостью
- Неограниченный канал (unbounded) с неограниченной емкостью
Структура канала
Канал имеет сторону Отправителя (Sender) и сторону Получателя (Receiver). Обе стороны могут быть клонированы и использоваться из нескольких потоков.
Закрытие канала
Когда все отправители или все получатели уничтожаются, канал закрывается. Когда канал закрыт, нельзя отправлять новые сообщения, но оставшиеся сообщения все еще можно получить.
Канал также можно закрыть вручную, вызвав Sender::close() или Receiver::close().
Примеры
#![allow(unused)] fn main() { let (s, r) = async_channel::unbounded(); assert_eq!(s.send("Hello").await, Ok(())); assert_eq!(r.recv().await, Ok("Hello")); }
Структуры
| Структура | Описание |
|---|---|
Receiver | Сторона получения канала |
Recv | Фьючерс, возвращаемый Receiver::recv() |
RecvError | Ошибка, возвращаемая из Receiver::recv() |
Send | Фьючерс, возвращаемый Sender::send() |
SendError | Ошибка, возвращаемая из Sender::send() |
Sender | Сторона отправки канала |
WeakReceiver | Receiver, который не препятствует закрытию канала |
WeakSender | Sender, который не препятствует закрытию канала |
Перечисления
| Перечисление | Описание |
|---|---|
TryRecvError | Ошибка, возвращаемая из Receiver::try_recv() |
TrySendError | Ошибка, возвращаемая из Sender::try_send() |