跳到主内容
Rust
文章阅读

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}");
 };
}
返回顶部