Expand description
A simple (<100 LoC) “oneshot” channel for asynchronously sending a single value between tasks, in a thread-safe manner and async-runtime-agnostic manner.
This crate provides a oneshot channel that allows sending a single value from one producer to one consumer. The handle to the sender can be cloned, but only one send operation succeeds. Supports tasks running on different threads.
See oneshot
for more details.
§Examples
Basic usage:
use async_oneshot_channel::oneshot;
let (tx, rx) = oneshot();
let result = tx.send(42);
assert!(result.is_ok());
let received = block_on(rx.recv());
assert_eq!(received, Some(42));
Multiple senders (only one succeeds):
let (tx1, rx) = oneshot();
let tx2 = tx1.clone();
// First send succeeds
assert!(tx1.send(1).is_ok());
// Second send fails and returns the value
assert_eq!(tx2.send(2), Err(2));
let received = block_on(rx.recv());
assert_eq!(received, Some(1));
Handling sender drop:
let (tx, rx) = oneshot::<()>();
drop(tx);
// Receiver gets None when all senders are dropped without sending
let received = block_on(rx.recv());
assert_eq!(received, None);
Structs§
- The receiving half of the oneshot channel.
- Future returned by
oneshot
. When awaited, resolves to the value sent through the channel, orNone
if either: - The sending half of the oneshot channel.
Functions§
- Creates a new oneshot channel pair of sender and receiver.