pub struct MPMCReceiver<T> { /* private fields */ }Expand description
This is the receiving end of a standard mpmc view of the queue
It functions similarly to the BroadcastReceiver execpt there
is only ever one stream. As a result, the type doesn’t need to be clone
Implementations§
Source§impl<T> MPMCReceiver<T>
impl<T> MPMCReceiver<T>
Sourcepub fn try_recv(&self) -> Result<T, TryRecvError>
pub fn try_recv(&self) -> Result<T, TryRecvError>
Tries to receive a value from the queue without blocking.
§Examples:
use multiqueue2::mpmc_queue;
let (w, r) = mpmc_queue(10);
w.try_send(1).unwrap();
assert_eq!(1, r.try_recv().unwrap());use multiqueue2::mpmc_queue;
use std::thread;
let (send, recv) = mpmc_queue(10);
let handle = thread::spawn(move || {
for _ in 0..10 {
loop {
match recv.try_recv() {
Ok(val) => {
println!("Got {}", val);
break;
},
Err(_) => (),
}
}
}
assert!(recv.try_recv().is_err()); // recv would block here
});
for i in 0..10 {
send.try_send(i).unwrap();
}
// Drop the sender to close the queue
drop(send);
handle.join();Sourcepub fn recv(&self) -> Result<T, RecvError>
pub fn recv(&self) -> Result<T, RecvError>
Receives a value from the queue, blocks until there is data.
§Examples:
use multiqueue2::mpmc_queue;
let (w, r) = mpmc_queue(10);
w.try_send(1).unwrap();
assert_eq!(1, r.recv().unwrap());use multiqueue2::mpmc_queue;
use std::thread;
let (send, recv) = mpmc_queue(10);
let handle = thread::spawn(move || {
// note the lack of dealing with failed reads.
// unwrap 'ignores' the error where sender disconnects
for _ in 0..10 {
println!("Got {}", recv.recv().unwrap());
}
assert!(recv.try_recv().is_err());
});
for i in 0..10 {
send.try_send(i).unwrap();
}
// Drop the sender to close the queue
drop(send);
handle.join();Sourcepub fn unsubscribe(self) -> bool
pub fn unsubscribe(self) -> bool
Removes the given reader from the queue subscription lib Returns true if this is the last reader in a given broadcast unit
§Examples
use multiqueue2::mpmc_queue;
let (writer, reader) = mpmc_queue(2);
writer.try_send(1).expect("This will succeed since queue is empty");
reader.try_recv().expect("This reader can read");
reader.unsubscribe();
// Fails since there's no readers left
assert!(writer.try_send(1).is_err());Sourcepub fn into_single(self) -> Result<MPMCUniReceiver<T>, MPMCReceiver<T>>
pub fn into_single(self) -> Result<MPMCUniReceiver<T>, MPMCReceiver<T>>
If there is only one MPMCReceiver on the stream, converts the
Receiver into a MPMCUniReceiver otherwise returns the MPMCReceiver.
§Example:
use multiqueue2::mpmc_queue;
let (w, r) = mpmc_queue(10);
w.try_send(1).unwrap();
let r2 = r.clone();
// Fails since there's two receivers on the stream
assert!(r2.into_single().is_err());
let single_r = r.into_single().unwrap();
let val = match single_r.try_recv_view(|x| 2 * *x) {
Ok(val) => val,
Err(_) => panic!("Queue should have an element"),
};
assert_eq!(2, val);Sourcepub fn try_iter(&self) -> MPMCRefIter<'_, T>
pub fn try_iter(&self) -> MPMCRefIter<'_, T>
Returns a non-owning iterator that iterates over the queue until it fails to receive an item, either through being empty or begin disconnected. This iterator will never block.
§Examples:
use multiqueue2::mpmc_queue;
let (w, r) = mpmc_queue(2);
for _ in 0 .. 3 {
w.try_send(1).unwrap();
w.try_send(2).unwrap();
for val in r.try_iter().zip(1..2) {
assert_eq!(val.0, val.1);
}
}Trait Implementations§
Source§impl<T> Clone for MPMCReceiver<T>
impl<T> Clone for MPMCReceiver<T>
Source§impl<T: Debug> Debug for MPMCReceiver<T>
impl<T: Debug> Debug for MPMCReceiver<T>
Source§impl<'a, T: 'a> IntoIterator for &'a MPMCReceiver<T>
impl<'a, T: 'a> IntoIterator for &'a MPMCReceiver<T>
Source§impl<T> IntoIterator for MPMCReceiver<T>
impl<T> IntoIterator for MPMCReceiver<T>
impl<T: Send> Send for MPMCReceiver<T>
Auto Trait Implementations§
impl<T> !Freeze for MPMCReceiver<T>
impl<T> !RefUnwindSafe for MPMCReceiver<T>
impl<T> !Sync for MPMCReceiver<T>
impl<T> Unpin for MPMCReceiver<T>
impl<T> !UnwindSafe for MPMCReceiver<T>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more