Struct Receiver
struct Receiver<T> { ... }
The receiving half of Rust's channel (or sync_channel) type.
Different threads can share this Receiver by cloning it.
Messages sent to the channel can be retrieved using recv.
Examples
use channel;
use thread;
use Duration;
let = channel;
let tx_thread = spawn;
let = ;
let rx_thread_1 = spawn;
let rx_thread_2 = spawn;
tx_thread.join.unwrap;
rx_thread_1.join.unwrap;
rx_thread_2.join.unwrap;
Implementations
impl<T> Receiver<T>
fn try_recv(self: &Self) -> Result<T, TryRecvError>Attempts to receive a message from the channel 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.
If called on a zero-capacity channel, this method will receive a message only if there happens to be a send operation on the other side of the channel at the same time.
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 ; let : = channel; assert!;fn recv(self: &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
Sender, this receiver will wake up and return that message.If the corresponding
Senderhas disconnected, or it disconnects while this call is blocking, this call will wake up and returnErrto 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 mpmc; use thread; let = channel; let handle = spawn; handle.join.unwrap; assert_eq!;Buffering behavior:
use mpmc; use thread; use RecvError; let = channel; let handle = spawn; // wait for the thread to join so we ensure the sender is dropped handle.join.unwrap; assert_eq!; assert_eq!; assert_eq!; assert_eq!;fn recv_timeout(self: &Self, timeout: 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
Sender, this receiver will wake up and return that message.If the corresponding
Senderhas disconnected, or it disconnects while this call is blocking, this call will wake up and returnErrto 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:
#![feature(mpmc_channel)] use std::thread; use std::time::Duration; use std::sync::mpmc; let (send, recv) = mpmc::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:
#![feature(mpmc_channel)] use std::thread; use std::time::Duration; use std::sync::mpmc; let (send, recv) = mpmc::channel(); thread::spawn(move || { thread::sleep(Duration::from_millis(800)); send.send('a').unwrap(); }); assert_eq!( recv.recv_timeout(Duration::from_millis(400)), Err(mpmc::RecvTimeoutError::Timeout) );fn recv_deadline(self: &Self, deadline: Instant) -> Result<T, RecvTimeoutError>Attempts to wait for a value on this receiver, returning an error if the corresponding channel has hung up, or if
deadlineis reached.This function will always block the current thread if there is no data available and it's possible for more data to be sent. Once a message is sent to the corresponding
Sender, then this receiver will wake up and return that message.If the corresponding
Senderhas disconnected, or it disconnects while this call is blocking, this call will wake up and returnErrto 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 reaching deadline:
#![feature(mpmc_channel)] use std::thread; use std::time::{Duration, Instant}; use std::sync::mpmc; let (send, recv) = mpmc::channel(); thread::spawn(move || { send.send('a').unwrap(); }); assert_eq!( recv.recv_deadline(Instant::now() + Duration::from_millis(400)), Ok('a') );Receiving an error upon reaching deadline:
#![feature(mpmc_channel)] use std::thread; use std::time::{Duration, Instant}; use std::sync::mpmc; let (send, recv) = mpmc::channel(); thread::spawn(move || { thread::sleep(Duration::from_millis(800)); send.send('a').unwrap(); }); assert_eq!( recv.recv_deadline(Instant::now() + Duration::from_millis(400)), Err(mpmc::RecvTimeoutError::Timeout) );fn try_iter(self: &Self) -> TryIter<'_, T>Returns an iterator that will attempt to yield all pending values. It will return
Noneif there are no more pending values or if the channel has hung up. The iterator will never [panic!] or block the user by waiting for values.Examples
#![feature(mpmc_channel)] use std::sync::mpmc::channel; use std::thread; use std::time::Duration; let (sender, receiver) = channel(); // nothing is in the buffer yet assert!(receiver.try_iter().next().is_none()); thread::spawn(move || { thread::sleep(Duration::from_secs(1)); sender.send(1).unwrap(); sender.send(2).unwrap(); sender.send(3).unwrap(); }); // nothing is in the buffer yet assert!(receiver.try_iter().next().is_none()); // block for two seconds thread::sleep(Duration::from_secs(2)); let mut iter = receiver.try_iter(); assert_eq!(iter.next(), Some(1)); assert_eq!(iter.next(), Some(2)); assert_eq!(iter.next(), Some(3)); assert_eq!(iter.next(), None);
impl<T> Receiver<T>
fn is_empty(self: &Self) -> boolReturns
trueif the channel is empty.Note: Zero-capacity channels are always empty.
Examples
use mpmc; use thread; let = channel; assert!; let handle = spawn; handle.join.unwrap; assert!;fn is_full(self: &Self) -> boolReturns
trueif the channel is full.Note: Zero-capacity channels are always full.
Examples
use mpmc; use thread; let = sync_channel; assert!; let handle = spawn; handle.join.unwrap; assert!;fn len(self: &Self) -> usizeReturns the number of messages in the channel.
Examples
use mpmc; use thread; let = channel; assert_eq!; let handle = spawn; handle.join.unwrap; assert_eq!;fn capacity(self: &Self) -> Option<usize>If the channel is bounded, returns its capacity.
Examples
use mpmc; use thread; let = sync_channel; assert_eq!; let handle = spawn; handle.join.unwrap; assert_eq!;fn same_channel(self: &Self, other: &Receiver<T>) -> boolReturns
trueif receivers belong to the same channel.Examples
use mpmc; let = ; let = ; assert!; assert!;fn iter(self: &Self) -> Iter<'_, T>Returns an iterator that will block waiting for messages, but never [
panic!]. It will returnNonewhen the channel has hung up.Examples
use channel; use thread; let = channel; spawn; let mut iter = recv.iter; assert_eq!; assert_eq!; assert_eq!; assert_eq!;
impl<T> Any for Receiver<T>
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Receiver<T>
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Receiver<T>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> Clone for Receiver<T>
fn clone(self: &Self) -> Self
impl<T> CloneToUninit for Receiver<T>
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> Debug for Receiver<T>
fn fmt(self: &Self, f: &mut fmt::Formatter<'_>) -> fmt::Result
impl<T> Drop for Receiver<T>
fn drop(self: &mut Self)
impl<T> Freeze for Receiver<T>
impl<T> From for Receiver<T>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> IntoIterator for Receiver<T>
fn into_iter(self: Self) -> IntoIter<T>
impl<T> RefUnwindSafe for Receiver<T>
impl<T> ToOwned for Receiver<T>
fn to_owned(self: &Self) -> Tfn clone_into(self: &Self, target: &mut T)
impl<T> Unpin for Receiver<T>
impl<T> UnwindSafe for Receiver<T>
impl<T, U> Into for Receiver<T>
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for Receiver<T>
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Receiver<T>
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>