Rust の MPSC を利用する

Muhammad Adil 2023年1月30日
  1. チャネルの種類
  2. RustMPSC を使用する手順
Rust の MPSC を利用する

Rust には、プログラマーにとって魅力的な選択肢となる多くの機能があります。1つは、同じチャネルを介してさまざまなタイプのメッセージを送信する機能です。

この機能により、Rust プログラマーはデータの競合を回避し、プログラムのメモリ使用量をより細かく制御できます。この Rust チャネルのチュートリアルでは、同じチャネルを使用してさまざまなタイプを送信することに焦点を当てます。

MPSC(複数のプロデューサー、単一のコンシューマー)は、Rust プログラムでメッセージを送信するための優れた方法です。MPSC は、メッセージの送信と受信の両方に使用できるキューです。

Rust でのメッセージの送信は、std::sync モジュールで利用可能なチャネルを介して行うことができます。チャネルは、ロックや明示的な同期なしに、スレッドまたはプロセス間でデータを送受信するためのインターフェイスを提供します。

チャネルの種類

使用可能なチャネルには 2つのタイプがあります。

無期限にバッファリングされた非同期チャネル

すべての送信は非同期になります。したがって、channel 関数は (Sender, Receiver) タプルを返します(ブロックすることはありません)。理論上、チャネルには無限のバッファがあります。

制限された同期チャネル

sync channel メソッドは、待機中のメッセージ用に事前に割り当てられたバッファーサイズを持つ (SyncSender, Receiver) タプルを返します。すべての送信は同期され、十分なバッファスペースができるまでブロックされます。

境界が 0 の場合、チャネルがランデブーチャネルになり、各送信者がアトミックにメッセージを受信者に送信することに注意してください。

RustMPSC を使用する手順

Rust でチャネルを使用するには、MPSC クレートをインポートする必要があります。手順は次のとおりです。

  • ファイルの先頭に次の行を追加して、クレートをインポートします。
    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