Структура Sender
pub struct Sender<T> { /* private fields */ }
sync.Отправляет значение соответствующему Receiver.
Пара из Sender и Receiver создаётся функцией channel.
Примеры
use tokio::sync::oneshot;
let (tx, rx) = oneshot::channel();
tokio::spawn(async move {
if let Err(_) = tx.send(3) {
println!("the receiver dropped");
}
});
match rx.await {
Ok(v) => println!("got = {:?}", v),
Err(_) => println!("the sender dropped"),
}Если отправитель будет удалён, не отправив значение, получатель завершится с ошибкой error::RecvError:
use tokio::sync::oneshot;
let (tx, rx) = oneshot::channel::<u32>();
tokio::spawn(async move {
drop(tx);
});
match rx.await {
Ok(_) => panic!("This doesn't happen"),
Err(_) => println!("the sender dropped"),
}Чтобы использовать Sender из деструктора, поместите его в Option и вызовите Option::take.
use tokio::sync::oneshot;
struct SendOnDrop {
sender: Option<oneshot::Sender<&'static str>>,
}
impl Drop for SendOnDrop {
fn drop(&mut self) {
if let Some(sender) = self.sender.take() {
// Using `let _ =` to ignore send errors.
let _ = sender.send("I got dropped!");
}
}
}
let (send, recv) = oneshot::channel();
let send_on_drop = SendOnDrop { sender: Some(send) };
drop(send_on_drop);
assert_eq!(recv.await, Ok("I got dropped!"));Реализации
impl<T> Sender<T>
pub fn send(self, t: T) -> Result<(), T>
Пытается отправить значение по этому каналу и возвращает его, если отправить не удалось.
Этот метод потребляет self, поскольку по каналу oneshot можно отправить только одно значение. Метод не помечен как асинхронный, поскольку отправка сообщения по каналу oneshot никогда не требует ожидания. Поэтому метод send можно без проблем использовать как в синхронном, так и в асинхронном коде.
Отправка считается успешной, если установлено, что другой конец канала ещё не закрыт. Отправка считается неуспешной, если соответствующий получатель уже удалён из памяти. Обратите внимание: возвращаемое значение Err означает, что данные никогда не будут получены, однако возвращаемое значение Ok не означает, что данные будут получены. Соответствующий получатель может закрыть канал сразу после того, как эта функция вернёт Ok.
Примеры
Отправка значения другой задаче
use tokio::sync::oneshot;
let (tx, rx) = oneshot::channel();
tokio::spawn(async move {
if let Err(_) = tx.send(3) {
println!("the receiver dropped");
}
});
match rx.await {
Ok(v) => println!("got = {:?}", v),
Err(_) => println!("the sender dropped"),
}pub async fn closed(&mut self)
Ожидает закрытия соответствующего дескриптора Receiver.
Receiver закрывается либо явным вызовом close, либо при удалении значения Receiver.
Эта функция полезна в сочетании с select! для прерывания вычисления, если получатель больше не заинтересован в результате.
Возвращаемое значение
Возвращает Future, который необходимо ожидать.
Примеры
Базовое использование
use tokio::sync::oneshot;
let (mut tx, rx) = oneshot::channel::<()>();
tokio::spawn(async move {
drop(rx);
});
tx.closed().await;
println!("the receiver dropped");В сочетании с select
use tokio::sync::oneshot;
use tokio::time::{self, Duration};
async fn compute() -> String {
// Complex computation returning a `String`
}
let (mut tx, rx) = oneshot::channel();
tokio::spawn(async move {
tokio::select! {
_ = tx.closed() => {
// The receiver dropped, no need to do any further work
}
value = compute() => {
// The send can fail if the channel was closed at the exact same
// time as when compute() finished, so just ignore the failure.
let _ = tx.send(value);
}
}
});
// Wait for up to 10 seconds
let _ = time::timeout(Duration::from_secs(10), rx).await;pub fn is_closed(&self) -> bool
Возвращает true, если соответствующий дескриптор Receiver был удалён.
Receiver закрывается либо явным вызовом close, либо при удалении значения Receiver.
Если возвращено true, вызов send всегда завершится ошибкой.
Примеры
use tokio::sync::oneshot;
let (tx, rx) = oneshot::channel();
assert!(!tx.is_closed());
drop(rx);
assert!(tx.is_closed());
assert!(tx.send("never received").is_err());pub fn poll_closed(&mut self, cx: &mut Context<'_>) -> Poll<()>
Проверяет, закрыт ли канал oneshot, и, если нет, планирует Waker в переданном Context для получения уведомления о закрытии канала.
Receiver закрывается либо явным вызовом close, либо при удалении значения Receiver.
Обратите внимание: при многократных вызовах poll только Waker из Context, переданного последнему вызову, будет запланирован для получения сигнала пробуждения.
Возвращаемое значение
Эта функция возвращает:
-
Poll::Pending, если канал всё ещё открыт. -
Poll::Ready(()), если канал закрыт.
Примеры
use tokio::sync::oneshot;
use std::future::poll_fn;
let (mut tx, mut rx) = oneshot::channel::<()>();
tokio::spawn(async move {
rx.close();
});
poll_fn(|cx| tx.poll_closed(cx)).await;
println!("the receiver dropped");Реализации трейтов
Реализации автоматических трейтов
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> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
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/oneshot/struct.Sender.html