文章阅读
Rust中使用通道,有界通道,无界通道
2025/12/1663 次阅读3 分钟
Rust通道
rust通道,它有两部分组成,一个发送方,一个接收方,Sender,Receiver, 这两个部分有通道进行连接
注意:
- Sender 实现了Clone,所以可以有多个发送方,也可以叫生产方,但是Receiver不能
- send() 和 recv 会返回Result, 如果返回Err,表示通道被关闭,或者被丢弃
无界通道
简单,忽略
有界通道
注意:
- 需要sync_channel(5)需要传入一个参数,可以理解为消息容量,如果在子线程中发送了满足5条数量大小的消息,但是没有被消费掉,在子线程中会阻塞
- 如果通道关闭,发送方发送消息将返回错误
- 如果传入sync_channel(0)传入0,被称为交会通道,意思就是你每次发送一个,就要被消费一个,来回拉扯
use std::fmt::format;
use std::sync::mpsc;
use std::thread;
/**
rust通道,它有两部分组成,一个发送方,一个接收方,Sender,Receiver, 这两个部分有通道进行连接
注意:
* Sender 实现了Clone,所以可以有多个发送方,也可以叫生产方,但是Receiver不能
* send() 和 recv 会返回Result, 如果返回Err,表示通道被关闭,或者被丢弃
**/
fn main_1() {
let (tx,rx) = mpsc::channel();
tx.send(10).unwrap();
tx.send(20).unwrap();
println!("received: {:?}",rx.recv());
println!("received:{:?}",rx.recv());
let tx2 = tx.clone();
tx2.send(30).unwrap();
println!("received:{:?}",rx.recv())
}
/// 在线程中使用无界通道
fn main2(){
let (tx,rx) = mpsc::channel();
thread::spawn(move || {
let thread_id = thread::current().id();
for i in 1..10 {
tx.send(format!("Message {i}")).unwrap();
println!("{thread_id:?}: send message {i}");
}
println!("{thread_id:?} : done");
});
thread::sleep(std::time::Duration::from_millis(100));
for msg in rx.iter() {
println!("Main: got {msg}");
}
}
/**
使用有界通道
注意:
* 需要sync_channel(5)需要传入一个参数,可以理解为消息容量,如果在子线程中发送了满足5条数量大小的消息,但是没有被消费掉,在子线程中会阻塞
* 如果通道关闭,发送方发送消息将返回错误
* 如果传入sync_channel(0)传入0,被称为交会通道,意思就是你每次发送一个,就要被消费一个,来回拉扯
**/
fn main(){
let (tx,rx) = mpsc::sync_channel(5);
thread::spawn(move || {
let thread_id = thread::current().id();
for i in 1..10 {
tx.send(format!("Message: {i}")).unwrap();
println!("{thread_id:?}: send message {i}");
};
println!("{thread_id:?} done");
});
thread::sleep(std::time::Duration::from_millis(100));
for msg in rx.iter() {
println!("Main: got {msg}");
};
}