并发编程是现代软件开发的一个关键方面,Rust为管理并发执行提供了强大的工具。Rust并发模型的核心是通道和消息传递,它们允许线程通信并同步它们的活动。
通道(Channels)
use std::sync::mpsc;
fn main() {
let (sender, receiver) = mpsc::channel();
// 生成一个线程来发送消息
std::thread::spawn(move || {
sender.send("Hello, Channel!").unwrap();
});
// 接收消息
let received = receiver.recv().unwrap();
println!("Received: {}", received);
}
多生产者,单消费者
use std::sync::mpsc;
use std::thread;
fn main() {
let (sender, receiver) = mpsc::channel();
// 生成多个线程作为生产者
for i in 1..=3 {
let sender = sender.clone();
thread::spawn(move || {
sender.send(format!("Message {}", i)).unwrap();
});
}
// 接收消息
for received in receiver {
println!("Received: {}", received);
}
}
异步通道和选择性接收
use std::time::Duration;
use tokio::select;
use tokio::sync::mpsc;
#[tokio::main]
async fn main() {
let (sender1, mut receiver1) = mpsc::channel(1);
let (sender2, mut receiver2) = mpsc::channel(1);
// 生成一个线程向receiver1发送消息
tokio::spawn(async move {
tokio::time::sleep(Duration::from_secs(2)).await;
sender1.send("Message from Sender 1").await
});
// 生成一个线程向receiver2发送消息
tokio::spawn(async move {
tokio::time::sleep(Duration::from_secs(1)).await;
sender2.send("Message from Sender 2").await
});
// 接收
select! {
msg1 = receiver1.recv() => println!("Received: {:?}", msg1),
msg2 = receiver2.recv() => println!("Received: {:?}", msg2),
}
}
缓冲通道和容量
use std::sync::mpsc;
fn main() {
let (sender, receiver) = mpsc::sync_channel(2); // Creating a buffered channel with capacity 2
// 生成多个线程作为生产者
for i in 1..=4 {
let sender = sender.clone();
std::thread::spawn(move || {
sender.send(format!("Message {}", i)).unwrap();
println!("Sent: Message {}", i);
});
}
// 接收消息
for _ in 1..=4 {
let received = receiver.recv().unwrap();
println!("Received: {}", received);
}
}
总结