Функция channel
pub fn channel<T: Clone>(capacity: usize) -> (Sender<T>, Receiver<T>)
sync.Создаёт ограниченный канал с множеством отправителей и получателей, в котором каждое отправленное значение рассылается всем активным получателям.
Примечание: Указанное значение capacity округляется вверх до ближайшей степени двойки. Это округлённое значение определяет количество сообщений, которое может хранить внутренний кольцевой буфер, и используется для обнаружения отставания. Например, channel(3) работает так, как если бы ёмкость была равна 4.
Все данные, отправленные через Sender, станут доступны каждому активному Receiver в том же порядке, в котором они были отправлены.
Sender можно клонировать, чтобы send в тот же канал из разных точек процесса, или использовать параллельно из Arc. Новые дескрипторы Receiver создаются вызовом Sender::subscribe.
Если все дескрипторы Receiver будут отброшены, метод send вернёт SendError. Аналогично, если все дескрипторы Sender будут отброшены, метод recv вернёт RecvError.
Примеры
use tokio::sync::broadcast;
let (tx, mut rx1) = broadcast::channel(16);
let mut rx2 = tx.subscribe();
tokio::spawn(async move {
assert_eq!(rx1.recv().await.unwrap(), 10);
assert_eq!(rx1.recv().await.unwrap(), 20);
});
tokio::spawn(async move {
assert_eq!(rx2.recv().await.unwrap(), 10);
assert_eq!(rx2.recv().await.unwrap(), 20);
});
tx.send(10).unwrap();
tx.send(20).unwrap();Паника
Это приведёт к панике, если capacity равен 0.
Здесь заранее выделяется место для capacity сообщений. Ошибка выделения памяти может привести к панике или ошибке выделения памяти.
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/sync/broadcast/fn.channel.html