Struct uchan::RawReceiver
source · pub struct RawReceiver<E, T> { /* private fields */ }
Expand description
The receiving half of Rust’s raw_channel
type.
This half can only be owned by one thread.
Messages sent to the channel can be retrieved using recv
.
Examples
use uchan::channel;
use std::thread;
use std::time::Duration;
let (send, recv) = channel();
thread::spawn(move || {
send.send("Hello world!").unwrap();
thread::sleep(Duration::from_secs(2)); // block for two seconds
send.send("Delayed for 2 seconds").unwrap();
});
println!("{}", recv.recv().unwrap()); // Received immediately
println!("Waiting...");
println!("{}", recv.recv().unwrap()); // Received after 2 seconds
Implementations
sourceimpl<E, T> RawReceiver<E, T>
impl<E, T> RawReceiver<E, T>
sourcepub fn try_recv(&self) -> Result<T, TryRecvError>
pub fn try_recv(&self) -> Result<T, TryRecvError>
Attempts to return a pending value on this receiver without blocking.
This method will never block the caller in order to wait for data to become available. Instead, this will always return immediately with a possible option of pending data on the channel.
This is useful for a flavor of “optimistic check” before deciding to block on a receiver.
Compared with recv
, this function has two failure cases instead of one
(one for disconnection, one for an empty buffer).
Examples
use uchan::{Receiver, channel};
let (_, receiver): (_, Receiver<i32>) = channel();
assert!(receiver.try_recv().is_err());
sourceimpl<E: Event, T> RawReceiver<E, T>
impl<E: Event, T> RawReceiver<E, T>
sourcepub fn recv(&self) -> Result<T, RecvError>
pub fn recv(&self) -> Result<T, RecvError>
Attempts to wait for a value on this receiver, returning an error if the corresponding channel has hung up.
This function will always block the current thread if there is no data
available and it’s possible for more data to be sent (at least one sender
still exists). Once a message is sent to the corresponding RawSender
,
this receiver will wake up and return that message.
If the corresponding RawSender
has disconnected, or it disconnects while
this call is blocking, this call will wake up and return Err
to
indicate that no more messages can ever be received on this channel.
However, since channels are buffered, messages sent before the disconnect
will still be properly received.
Examples
use uchan::channel;
use std::thread;
let (send, recv) = channel();
let handle = thread::spawn(move || {
send.send(1u8).unwrap();
});
handle.join().unwrap();
assert_eq!(Ok(1), recv.recv());
Buffering behavior:
use uchan::{channel, RecvError};
use std::thread;
let (send, recv) = channel();
let handle = thread::spawn(move || {
send.send(1u8).unwrap();
send.send(2).unwrap();
send.send(3).unwrap();
drop(send);
});
// wait for the thread to join so we ensure the sender is dropped
handle.join().unwrap();
assert_eq!(Ok(1), recv.recv());
assert_eq!(Ok(2), recv.recv());
assert_eq!(Ok(3), recv.recv());
assert_eq!(Err(RecvError), recv.recv());
sourceimpl<E: TimedEvent, T> RawReceiver<E, T>
impl<E: TimedEvent, T> RawReceiver<E, T>
sourcepub fn recv_timeout(&self, timeout: E::Duration) -> Result<T, RecvTimeoutError>
pub fn recv_timeout(&self, timeout: E::Duration) -> Result<T, RecvTimeoutError>
Attempts to wait for a value on this receiver, returning an error if the
corresponding channel has hung up, or if it waits more than timeout
.
This function will always block the current thread if there is no data
available and it’s possible for more data to be sent (at least one sender
still exists). Once a message is sent to the corresponding RawSender
this receiver will wake up and return that message.
If the corresponding RawSender
has disconnected, or it disconnects while
this call is blocking, this call will wake up and return Err
to
indicate that no more messages can ever be received on this channel.
However, since channels are buffered, messages sent before the disconnect
will still be properly received.
Examples
Successfully receiving value before encountering timeout:
use std::thread;
use std::time::Duration;
use uchan::channel;
let (send, recv) = channel();
thread::spawn(move || {
send.send('a').unwrap();
});
assert_eq!(
recv.recv_timeout(Duration::from_millis(400)),
Ok('a')
);
Receiving an error upon reaching timeout:
use std::thread;
use std::time::Duration;
use uchan::{channel, RecvTimeoutError};
let (send, recv) = channel();
thread::spawn(move || {
thread::sleep(Duration::from_millis(800));
send.send('a').unwrap();
});
assert_eq!(
recv.recv_timeout(Duration::from_millis(400)),
Err(RecvTimeoutError::Timeout)
);