最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. 概述

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

Rust也提供了一種基于消息傳遞的并發(fā)方式,在rust里使用標(biāo)準(zhǔn)庫提供的Channel來實現(xiàn)。Channel包含發(fā)送端和接收端,我們可以通過調(diào)用發(fā)送端的方法來發(fā)送數(shù)據(jù),接收端會檢查和接收到達(dá)的數(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èi)者),即有多個發(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);
}

消費(fèi)者的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ù)到達(dá),返回OK,里面包含著數(shù)據(jù),否則返回錯誤。我們通常會使用循環(huán)來檢查try_recv的結(jié)果,如果消息還沒有來,我們也可以執(zhí)行其他的操作。

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

所有權(quán)先消息傳遞中非常重要,能幫你補(bǔ)全編寫安全、并發(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)機(jī)制會幫助我們編寫編寫安全、并發(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);
    }
}

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

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ù),可以通過程序運(yùn)行結(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使用Trait對象實現(xiàn)多態(tài)的詳細(xì)步驟

    Rust使用Trait對象實現(xiàn)多態(tài)的詳細(xì)步驟

    本文詳細(xì)介紹了在Rust中使用Trait對象實現(xiàn)運(yùn)行時多態(tài)的方法,通過一個圖形渲染系統(tǒng)的案例展示了如何統(tǒng)一管理不同類型的圖形對象,文章涵蓋了Trait對象的核心概念、語法、性能考量以及在實際項目中的應(yīng)用場景,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Rust中print和println的區(qū)別實例解析

    Rust中print和println的區(qū)別實例解析

    Rust中print!和println!宏用于輸出,區(qū)別在于println!自動換行,print!不換行,前者適用于同一行內(nèi)組合輸出,后者用于獨立日志或需換行場景,均支持格式化參數(shù),如{},本文給大家介紹Rust中print和println的區(qū)別,感興趣的朋友一起看看吧
    2025-06-06
  • Rust如何使用config配置API

    Rust如何使用config配置API

    這篇文章主要介紹了Rust如何使用config配置API,這里記錄了如何聲明配置類型,讀取配置,通過環(huán)境變量來覆蓋配置值等開發(fā)中常見的動作,需要的朋友可以參考下
    2023-11-11
  • Rust中箱、包和模塊的學(xué)習(xí)筆記

    Rust中箱、包和模塊的學(xué)習(xí)筆記

    Rust中有三個重要的組織概念:箱、包、模塊,本文主要介紹了Rust中箱、包和模塊的學(xué)習(xí)筆記,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Tauri?打開本地文件踩坑分析解決

    Tauri?打開本地文件踩坑分析解決

    這篇文章主要為大家介紹了Tauri?打開本地文件踩坑分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Rust?中?Mutex?的基本用法

    Rust?中?Mutex?的基本用法

    Rust?標(biāo)準(zhǔn)庫中的?Mutex?結(jié)構(gòu)體位于?std::sync::Mutex?中,它提供了線程安全的數(shù)據(jù)訪問,Mutex?保證了在同一時間只有一個線程可以訪問被鎖定的數(shù)據(jù),這篇文章主要介紹了Rust?中?Mutex?的基本用法,需要的朋友可以參考下
    2024-05-05
  • 利用rust編一個靜態(tài)博客工具

    利用rust編一個靜態(tài)博客工具

    這篇文章主要為大家詳細(xì)介紹了如何利用rust編一個靜態(tài)博客工具,這個靜態(tài)博客的工具主要是把md文檔轉(zhuǎn)為html靜態(tài)網(wǎng)站/博客,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Rust語言數(shù)據(jù)類型的具體使用

    Rust語言數(shù)據(jù)類型的具體使用

    在Rust中,每個值都有一個明確的數(shù)據(jù)類型,本文主要介紹了Rust語言數(shù)據(jù)類型的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Rust 原始指針功能探索

    Rust 原始指針功能探索

    這篇文章主要為大家介紹了Rust 原始指針功能探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 如何使用rust實現(xiàn)簡單的單鏈表

    如何使用rust實現(xiàn)簡單的單鏈表

    實現(xiàn)單鏈表在別的語言里面可能是一件簡單的事情,單對于Rust來說,絕對不簡單,下面這篇文章主要給大家介紹了關(guān)于如何使用rust實現(xiàn)簡單的單鏈表的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03

最新評論

汤原县| 广灵县| 托里县| 张家界市| 黔南| 藁城市| 隆化县| 读书| 皋兰县| 通渭县| 元谋县| 县级市| 加查县| 梧州市| 独山县| 海阳市| 安泽县| 湟中县| 池州市| 景东| 雅安市| 昌图县| 聂荣县| 洪洞县| 昭觉县| 吉木乃县| 思茅市| 扎兰屯市| 武定县| 滦南县| 武夷山市| 康定县| 尼木县| 安康市| 永登县| 黑河市| 北安市| 武夷山市| 泸州市| 隆子县| 陇川县|