pub struct OwnedPermit<T> { /* private fields */ }
Expand description
Owned permit to send one value into the channel.
This is identical to the Permit
type, except that it moves the sender
rather than borrowing it.
OwnedPermit
values are returned by Sender::reserve_owned()
and
Sender::try_reserve_owned()
and are used to guarantee channel capacity
before generating a message to send.
Implementations§
source§impl<T> OwnedPermit<T>
impl<T> OwnedPermit<T>
sourcepub fn send(self, value: T) -> Sender<T>
pub fn send(self, value: T) -> Sender<T>
Sends a value using the reserved capacity.
Capacity for the message has already been reserved. The message is sent
to the receiver and the permit is consumed. The operation will succeed
even if the receiver half has been closed. See Receiver::close
for
more details on performing a clean shutdown.
Unlike Permit::send
, this method returns the Sender
from which
the OwnedPermit
was reserved.
§Examples
use tokio::sync::mpsc;
#[tokio::main]
async fn main() {
let (tx, mut rx) = mpsc::channel(1);
// Reserve capacity
let permit = tx.reserve_owned().await.unwrap();
// Send a message on the permit, returning the sender.
let tx = permit.send(456);
// The value sent on the permit is received
assert_eq!(rx.recv().await.unwrap(), 456);
// We may now reuse `tx` to send another message.
tx.send(789).await.unwrap();
}
sourcepub fn release(self) -> Sender<T>
pub fn release(self) -> Sender<T>
Releases the reserved capacity without sending a message, returning the
Sender
.
§Examples
use tokio::sync::mpsc;
#[tokio::main]
async fn main() {
let (tx, rx) = mpsc::channel(1);
// Clone the sender and reserve capacity
let permit = tx.clone().reserve_owned().await.unwrap();
// Trying to send on the original `tx` will fail, since the `permit`
// has reserved all the available capacity.
assert!(tx.try_send(123).is_err());
// Release the permit without sending a message, returning the clone
// of the sender.
let tx2 = permit.release();
// We may now reuse `tx` to send another message.
tx.send(789).await.unwrap();
}