Структура Sender
pub struct Sender<T> { /* private fields */ }
sync.Отправляющая половина канала broadcast.
Может использоваться из множества потоков. Сообщения можно отправлять с помощью send.
Примеры
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();Реализации
impl<T> Sender<T>
pub fn new(capacity: usize) -> Self
Создаёт передающую половину канала broadcast.
Дополнительную информацию об этом методе см. в документации к broadcast::channel.
pub fn send(&self, value: T) -> Result<usize, SendError<T>>
Пытается отправить значение всем активным дескрипторам Receiver, возвращая его, если отправить его не удалось.
Отправка считается успешной, если существует хотя бы один активный дескриптор Receiver. Отправка завершается неудачей, если все связанные с каналом дескрипторы Receiver уже были удалены.
Возвращаемое значение
В случае успеха возвращается количество подписанных дескрипторов Receiver. Это не означает, что сообщение получат все эти получатели: получатель может быть удалён или отстать (см. раздел об отставании) до получения сообщения.
Примечание
Возвращаемое значение Ok не означает, что отправленное значение увидит любой или все активные дескрипторы Receiver. Дескрипторы Receiver могут быть удалены до получения отправленного сообщения.
Возвращаемое значение Err не означает, что последующие вызовы send завершатся неудачей. Новые дескрипторы Receiver можно создать, вызвав subscribe.
Примеры
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();pub fn subscribe(&self) -> Receiver<T>
Создаёт новый дескриптор Receiver, который будет получать значения, отправленные после этого вызова subscribe.
Примеры
use tokio::sync::broadcast;
let (tx, _rx) = broadcast::channel(16);
// Will not be seen
tx.send(10).unwrap();
let mut rx = tx.subscribe();
tx.send(20).unwrap();
let value = rx.recv().await.unwrap();
assert_eq!(20, value);pub fn downgrade(&self) -> WeakSender<T>
Преобразует Sender в WeakSender, который не учитывается семантикой RAII: если все экземпляры Sender канала будут удалены, а останутся только экземпляры WeakSender, канал будет закрыт.
pub fn len(&self) -> usize
Возвращает количество значений в очереди.
Значение остаётся в очереди, пока его не получат все получатели, активные на момент отправки, или пока оно не будет вытеснено из очереди последующими отправками, превысившими её ёмкость.
Примечание
В отличие от Receiver::len, этот метод сообщает только о значениях в очереди и не учитывает значения, вытесненные из очереди до того, как их получили все получатели.
Примеры
use tokio::sync::broadcast;
let (tx, mut rx1) = broadcast::channel(16);
let mut rx2 = tx.subscribe();
tx.send(10).unwrap();
tx.send(20).unwrap();
tx.send(30).unwrap();
assert_eq!(tx.len(), 3);
rx1.recv().await.unwrap();
// The len is still 3 since rx2 hasn't seen the first value yet.
assert_eq!(tx.len(), 3);
rx2.recv().await.unwrap();
assert_eq!(tx.len(), 2);pub fn is_empty(&self) -> bool
Возвращает true, если в очереди нет значений.
Примеры
use tokio::sync::broadcast;
let (tx, mut rx1) = broadcast::channel(16);
let mut rx2 = tx.subscribe();
assert!(tx.is_empty());
tx.send(10).unwrap();
assert!(!tx.is_empty());
rx1.recv().await.unwrap();
// The queue is still not empty since rx2 hasn't seen the value.
assert!(!tx.is_empty());
rx2.recv().await.unwrap();
assert!(tx.is_empty());pub fn receiver_count(&self) -> usize
Возвращает количество активных получателей.
Активный получатель — это дескриптор Receiver, возвращённый функцией channel или subscribe. Именно эти дескрипторы будут получать значения, отправленные через этот Sender.
Примечание
Нет гарантии, что отправленное сообщение дойдёт до такого количества получателей. Активные получатели могут больше не вызывать recv до удаления.
Примеры
use tokio::sync::broadcast;
let (tx, _rx1) = broadcast::channel(16);
assert_eq!(1, tx.receiver_count());
let mut _rx2 = tx.subscribe();
assert_eq!(2, tx.receiver_count());
tx.send(10).unwrap();pub fn same_channel(&self, other: &Self) -> bool
Возвращает true, если отправители принадлежат одному каналу.
Примеры
use tokio::sync::broadcast;
let (tx, _rx) = broadcast::channel::<()>(16);
let tx2 = tx.clone();
assert!(tx.same_channel(&tx2));
let (tx3, _rx3) = broadcast::channel::<()>(16);
assert!(!tx3.same_channel(&tx2));pub async fn closed(&self)
Будущее, которое завершается, когда число подписанных на этот Sender получателей становится равным нулю.
Примеры
use futures::FutureExt;
use tokio::sync::broadcast;
let (tx, mut rx1) = broadcast::channel::<u32>(16);
let mut rx2 = tx.subscribe();
let _ = tx.send(10);
assert_eq!(rx1.recv().await.unwrap(), 10);
drop(rx1);
assert!(tx.closed().now_or_never().is_none());
assert_eq!(rx2.recv().await.unwrap(), 10);
drop(rx2);
assert!(tx.closed().now_or_never().is_some());pub fn strong_count(&self) -> usize
Возвращает число дескрипторов Sender.
pub fn weak_count(&self) -> usize
Возвращает число дескрипторов WeakSender.
Реализации трейтов
Автоматические реализации трейтов
impl<T> !RefUnwindSafe for Sender<T>
impl<T> !UnwindSafe for Sender<T>
impl<T> Freeze for Sender<T>
impl<T> Send for Sender<T>where T: Send,
impl<T> Sync for Sender<T>where T: Send,
impl<T> Unpin for Sender<T>
impl<T> UnsafeUnpin for Sender<T>
Общие реализации
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneToUninit for Twhere T: Clone,
unsafe fn clone_to_uninit(&self, dest: *mut u8)
clone_to_uninit)
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> ToOwned for Twhere T: Clone,
type Owned = T
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Subscriber к этому типу и возвращает оболочку WithDispatch. Подробнее
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/sync/broadcast/struct.Sender.html