A channel separates message producers from consumers. This example uses it on one thread so replay stays deterministic.

Program

Play the program to choose the first message and receive both queued messages in order.

first
channel_queue.rs
Replay: real traced execution (multi-file project)
use std::sync::mpsc;

fn main() {
    let first = "build";
    let (sender, receiver) = mpsc::channel();
    sender.send(first).unwrap();
    sender.send("done").unwrap();
    let a = receiver.recv().unwrap();
    let b = receiver.recv().unwrap();
    println!("{a}->{b}");
}
use std::sync::mpsc;

fn main() {
    let first = "test";
    let (sender, receiver) = mpsc::channel();
    sender.send(first).unwrap();
    sender.send("done").unwrap();
    let a = receiver.recv().unwrap();
    let b = receiver.recv().unwrap();
    println!("{a}->{b}");
}
use std::sync::mpsc;

fn main() {
    let first = "deploy";
    let (sender, receiver) = mpsc::channel();
    sender.send(first).unwrap();
    sender.send("done").unwrap();
    let a = receiver.recv().unwrap();
    let b = receiver.recv().unwrap();
    println!("{a}->{b}");
}
  1. first ← "build", a ← "build", b ← "done"

    3fn main() {4    let firs→ "build"t = "build"; //@first="build", "test", "deploy"5    let (sender, receiver) = mpsc::channel();6    sender.send(first).unwrap();7    sender.send("done").unwrap();8    let → "build"a = receiver.recv().unwrap();9    let → "done"b = receiver.recv().unwrap();10    println!("{a}->{b}");11}
    outputbuild->done
  1. first ← "test", a ← "test", b ← "done"

    3fn main() {4    let firs→ "test"t = "test";5    let (sender, receiver) = mpsc::channel();6    sender.send(first).unwrap();7    sender.send("done").unwrap();8    let → "test"a = receiver.recv().unwrap();9    let → "done"b = receiver.recv().unwrap();10    println!("{a}->{b}");11}
    outputtest->done
  1. first ← "deploy", a ← "deploy", b ← "done"

    3fn main() {4    let firs→ "deploy"t = "deploy";5    let (sender, receiver) = mpsc::channel();6    sender.send(first).unwrap();7    sender.send("done").unwrap();8    let → "deploy"a = receiver.recv().unwrap();9    let → "done"b = receiver.recv().unwrap();10    println!("{a}->{b}");11}
    outputdeploy->done
channel `mpsc::channel` creates a sender and receiver pair.
send `send` appends a message for the receiver to consume later.
recv `recv` removes the next queued message in FIFO order.