使用 Rust MPSC

Muhammad Adil 2023年1月30日 2022年6月15日
  1. 通道的类型
  2. 使用 Rust MPSC 的步骤
使用 Rust MPSC

Rust 有许多特性,使其成为程序员的一个有吸引力的选择。一是能够通过同一通道发送不同类型的消息。

此功能允许 Rust 程序员避免数据竞争并更多地控制程序的内存使用。本 Rust 通道教程将重点介绍使用同一通道发送不同类型的内容。

MPSC(多个生产者,单个消费者)是在 Rust 程序中发送消息的绝佳方式。MPSC 是一个可用于发送和接收消息的队列。

在 Rust 中发送消息可以通过 std::sync 模块中可用的通道来完成。通道提供了一个接口,用于在线程或进程之间发送和接收数据,而无需锁定或显式同步。

通道的类型

有两种类型的频道可用:

无限缓冲的异步通道

所有发送都是异步的;因此,通道函数将返回一个 (Sender, Receiver) 元组(它们从不阻塞)。通道理论上有无限的缓冲。

有界的同步通道

同步通道方法返回一个 (SyncSender, Receiver) 元组,其中包含为等待消息预先分配的缓冲区大小。在有足够的缓冲区空间之前,所有传输都将是同步和阻塞的。

值得注意的是,0 的界限允许通道成为一个集合通道,其中每个发送者原子地向接收者发送消息。

使用 Rust MPSC 的步骤

要在 Rust 中使用通道,你必须导入 MPSC crate。步骤如下:

  • 通过在文件顶部添加以下行来导入 crate:
    use mpsc::{Sender, Receiver};
    
  • 通过在导入后添加此行来创建新的发送者和接收者:
    let (tx, rx) = mpsc::channel();
    
  • 最后,在 tx 上发送消息。

让我们讨论一个例子。

use std::sync::mpsc::{self, Receiver, Sender};
enum Furniture {
    Bed(i32),
    Table(i32)
}
fn main() {
    let (tx, rx): (Sender<Furniture>, Receiver<Furniture>) = mpsc::channel();
    tx.send(Furniture::Table(2)).unwrap();
    tx.send(Furniture::Bed(4)).unwrap();
    for _ in 0..2 {
        match rx.recv().unwrap() {
            Furniture::Bed(a) => println!("Got {} Beds", a),
            Furniture::Table(b) => println!("Got {} Tables", b),
        }
    }
}

输出:

Got 2 Tables
Got 4 Beds

点击这里查看上述代码的演示。

Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook