Function zng_task::channel::bounded

source ·
pub fn bounded<T>(capacity: usize) -> (Sender<T>, Receiver<T>)
Expand description

Create a channel with a maximum capacity.

Bounded channels send until the channel reaches its capacity then it awaits until a message is received before sending another message.

§Examples

The example spawns two parallel tasks, the receiver task takes a while to start receiving but then rapidly consumes the 2 messages in the buffer and unblocks the sender to send more messages.

use zng_task::{self as task, channel};

let (sender, receiver) = channel::bounded(2);

task::spawn(async move {
    for msg in ["Hello!", "Data!"].into_iter().cycle() {
        task::deadline(300.ms()).await;
        if let Err(e) = sender.send(msg).await {
            eprintln!("no receiver connected, the message `{}` was not send", e.0);
            break;
        }
    }
});
task::spawn(async move {
    task::deadline(5.secs()).await;
     
    loop {
        match receiver.recv().await {
            Ok(msg) => println!("{msg}"),
            Err(_) => {
                eprintln!("no message in channel and no sender connected");
                break;
            }
        }
    }
});