使用 Rust MPSC

Muhammad Adil 2023年1月30日
  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
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