Concurrency Building Blocks
Channel Queue
Send Then Receive Messages
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.
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}");
}
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
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
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.