欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Rust使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)

 更新時間:2023年12月07日 10:17:24   作者:一諾滾雪球  
消息傳遞是一種很流行且能保證安全并發(fā)的技術(shù),Rust也提供了一種基于消息傳遞的并發(fā)方式,在rust里使用標準庫提供的Channel來實現(xiàn),下面我們就來學(xué)習(xí)一下如何使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)吧

1. 概述

消息傳遞是一種很流行且能保證安全并發(fā)的技術(shù),在這種機制里線程(或Actor)通過彼此發(fā)送消息(數(shù)據(jù))來進行通信。Go語言中有一句名言:“不要用共享內(nèi)存來通信,要用通信來共享內(nèi)存”,Go語言這種并發(fā)機制就體現(xiàn)了這個思想。

Rust也提供了一種基于消息傳遞的并發(fā)方式,在rust里使用標準庫提供的Channel來實現(xiàn)。Channel包含發(fā)送端和接收端,我們可以通過調(diào)用發(fā)送端的方法來發(fā)送數(shù)據(jù),接收端會檢查和接收到達的數(shù)據(jù)。如果發(fā)送端和接收端的任意一端被丟棄了,那么Channel就關(guān)閉了。

2. 使用Channel

2.1 在不同線程之間創(chuàng)建和接收數(shù)據(jù)

使用mpsc::channel函數(shù)來創(chuàng)建Channel,mpsc表示multiple producer, singer consumer(多個生產(chǎn)者、一個消費者),即有多個發(fā)送端,但只有一個接收端。調(diào)用該函數(shù)將返回一個元組,元組里的元素分別是發(fā)送端、接收端。

如下示例代碼:

use std::sync::mpsc;
use std::thread;

fn main() {
    let (tx, rx) = mpsc::channel();

    thread::spawn(move || {
        let val = String::from("hi");
        tx.send(val).unwrap();
    });

    let received = rx.recv().unwrap();
    println!("Got: {}", received);
}

消費者的recv方法一直會阻塞當(dāng)前線程,直到接收到消息為止。

2.2 發(fā)送端的send方法

該方法的參數(shù)為想要發(fā)送的數(shù)據(jù),返回值為Result<T, E>,如果有問題(例如接收端已經(jīng)被丟棄),將返回一個錯誤。

2.3 接收端的方法

recv方法阻止當(dāng)前線程執(zhí)行,直到Channel中有值被送來。一旦收到值,就會返回Result<T>,所有這個管道的所有發(fā)送端都關(guān)閉了,就會收到一個錯誤。

try_recv方法不會阻塞當(dāng)前的線程,如果有數(shù)據(jù)到達,返回OK,里面包含著數(shù)據(jù),否則返回錯誤。我們通常會使用循環(huán)來檢查try_recv的結(jié)果,如果消息還沒有來,我們也可以執(zhí)行其他的操作。

2.4 channel和所有權(quán)轉(zhuǎn)移

所有權(quán)先消息傳遞中非常重要,能幫你補全編寫安全、并發(fā)的代碼。

我們先看以下的示例代碼:

use std::sync::mpsc;
use std::thread;

fn main() {
    let (tx, rx) = mpsc::channel();

    thread::spawn(move || {
        let val = String::from("hi");
        tx.send(val).unwrap();

        // 下面一行代碼將會報錯,因為所有權(quán)已經(jīng)被轉(zhuǎn)移
        println("val is {}", val);
    });

    let received = rx.recv().unwrap();
    println!("Got: {}", received);
}

在上面的示例代碼中,借用了已移動的值,因此會發(fā)生編譯錯誤。所以所有權(quán)機制會幫助我們編寫編寫安全、并發(fā)的代碼。

2.5 發(fā)送多個值

我們通過發(fā)送多個值,就可以看到接收者在等待的過程。

如下示例代碼:

use std::sync::mpsc;
use std::{thread, vec};
use std::time::Duration;

fn main() {
    let (tx, rx) = mpsc::channel();

    thread::spawn(move || {
        let vals = vec![
            String::from("hi"),
            String::from("from"),
            String::from("the"),
            String::from("thread"),
        ];

        // 循環(huán)分別發(fā)送四個字符串
        for val in vals {
            tx.send(val).unwrap();
            thread::sleep(Duration::from_millis(1000));
        }
    });

    // 我們把接收端當(dāng)作迭代器來使用,這樣就不需要顯式調(diào)用recv方法
    for received in rx {
        println!("Got: {}", received);
    }
}

運行以上的代碼,我們將看到接收端在等待消息的過程。

2.6 通過克隆創(chuàng)建多個發(fā)送者

通過調(diào)用mpsc::Sender::clone函數(shù)可以克隆發(fā)送者。

如下示例代碼:

use std::sync::mpsc;
use std::{thread, vec};
use std::time::Duration;

fn main() {
    let (tx, rx) = mpsc::channel();

    let tx1 = mpsc::Sender::clone(&tx);

    thread::spawn(move || {
        let vals = vec![
            String::from("1: hi"),
            String::from("1: from"),
            String::from("1: the"),
            String::from("1: thread"),
        ];

        // 循環(huán)分別發(fā)送四個字符串
        for val in vals {
            tx1.send(val).unwrap();
            thread::sleep(Duration::from_millis(200));
        }
    });

    thread::spawn(move || {
        let vals = vec![
            String::from("hi"),
            String::from("from"),
            String::from("the"),
            String::from("thread"),
        ];

        // 循環(huán)分別發(fā)送四個字符串
        for val in vals {
            tx.send(val).unwrap();
            thread::sleep(Duration::from_millis(200));
        }
    });

    // 我們把接收端當(dāng)作迭代器來使用,這樣就不需要顯式調(diào)用recv方法
    for received in rx {
        println!("Got: {}", received);
    }
}

在以上的示例代碼中,我們通過兩個子線程由兩個發(fā)送者來發(fā)數(shù)據(jù)。并在主線程中使用接收者接收數(shù)據(jù),可以通過程序運行結(jié)果看到由兩個發(fā)送者發(fā)送的數(shù)據(jù)被交替輸出。

到此這篇關(guān)于Rust使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Rust Channel跨線程傳遞數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)

    Rust使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)

    消息傳遞是一種很流行且能保證安全并發(fā)的技術(shù),Rust也提供了一種基于消息傳遞的并發(fā)方式,在rust里使用標準庫提供的Channel來實現(xiàn),下面我們就來學(xué)習(xí)一下如何使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)吧
    2023-12-12
  • Rust自定義安裝路徑的詳細圖文教程

    Rust自定義安裝路徑的詳細圖文教程

    工欲善其事必先利其器,無論是對小白還是大神來說,想要學(xué)習(xí) Rust 第一步那必須是 Rust 的環(huán)境配置,下面這篇文章主要給大家介紹了關(guān)于Rust自定義安裝路徑的詳細圖文教程,需要的朋友可以參考下
    2023-03-03
  • Rust之Substrate框架中Core詳解

    Rust之Substrate框架中Core詳解

    Substrate是一個用于構(gòu)建區(qū)塊鏈的開發(fā)框架,它由Parity團隊基于Rust語言開發(fā)而成,是一個開箱即用的區(qū)塊鏈構(gòu)造器,本文詳細介紹了Substrate框架中的Core,需要的朋友可以參考下
    2023-05-05
  • Rust 入門之函數(shù)和注釋實例詳解

    Rust 入門之函數(shù)和注釋實例詳解

    這篇文章主要為大家介紹了Rust 入門之函數(shù)和注釋實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Rust?編程語言中的所有權(quán)ownership詳解

    Rust?編程語言中的所有權(quán)ownership詳解

    這篇文章主要介紹了Rust?編程語言中的所有權(quán)ownership詳解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Rust中vector的詳細用法

    Rust中vector的詳細用法

    Rust和C++同樣也有vector概念,本文主要介紹了Rust中vector的詳細用法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Rust字符串匹配Rabin-Karp算法詳解

    Rust字符串匹配Rabin-Karp算法詳解

    Rabin-Karp算法也可以叫 Karp-Rabin 算法,它是用來解決多模式串匹配問題的,它的實現(xiàn)方式有點與眾不同,首先是計算兩個字符串的哈希值,然后通過比較這兩個哈希值的大小來判斷是否出現(xiàn)匹配,本文詳細介紹了字符串匹配Rabin-Karp算法,需要的朋友可以參考下
    2023-05-05
  • rust標準庫std::env環(huán)境相關(guān)的常量

    rust標準庫std::env環(huán)境相關(guān)的常量

    在本章節(jié)中, 我們探討了Rust處理命令行參數(shù)的常見的兩種方式和處理環(huán)境變量的兩種常見方式, 拋開Rust的語法, 實際上在命令行參數(shù)的處理方式上, 與其它語言大同小異, 可能影響我們習(xí)慣的也就只剩下語法,本文介紹rust標準庫std::env的相關(guān)知識,感興趣的朋友一起看看吧
    2024-03-03
  • 詳解Rust 生命周期符號使用的方法和規(guī)律

    詳解Rust 生命周期符號使用的方法和規(guī)律

    生命周期是 Rust 中處理引用和所有權(quán)的關(guān)鍵概念,通過正確使用生命周期符號和遵循相關(guān)規(guī)律,你可以編寫出安全、高效的 Rust 代碼,這篇文章主要介紹了Rust 生命周期符號使用的方法和規(guī)律,需要的朋友可以參考下
    2024-03-03
  • Rust使用libloader調(diào)用動態(tài)鏈接庫

    Rust使用libloader調(diào)用動態(tài)鏈接庫

    這篇文章主要為大家介紹了Rust使用libloader調(diào)用動態(tài)鏈接庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09

最新評論