国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Rust 并行庫 crossbeam 的 Channel 示例

這篇具有很好參考價(jià)值的文章主要介紹了Rust 并行庫 crossbeam 的 Channel 示例。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

示例1

一個(gè)不完整的示例:

let (tx, rx) = channel::unbounded::<Task>();
let mut handlers = vec![];

for _ in 0..number {
    let rx = rx.clone();
    let handle = thread::spawn(move || {
        while let Some(task) = rx.recv() {
            task.call_box();
        }
    });

    handlers.push(handle);
}

該例子中,rx 可以被多個(gè)線程使用,是線程安全的。這就是所謂的 MPMC 模式。設(shè)想 channel 中有 10 個(gè)數(shù)據(jù),MPMC 模式允許10個(gè)線程同時(shí)利用 rx 從 channel 中讀取數(shù)據(jù)。

Rust 自帶的 channel 是 MPSC 模式的,一次僅允許一個(gè)線程從 channel 讀取數(shù)據(jù)。顯然 crossbeam 效率更高。

示例2

use crossbeam::channel;
use crossbeam::thread;
use std::thread::sleep;
use std::time::Duration;

// 定義Task結(jié)構(gòu)體
struct Task {
    data: usize, // 假設(shè)任務(wù)包含一個(gè)數(shù)據(jù)字段
    call_box: Box<dyn FnMut()>, // 假設(shè)任務(wù)包含一個(gè)可調(diào)用對象的裝箱指針
}

impl Task {
    fn new(data: usize, call_box: impl FnMut() + 'static) -> Self {
        Task {
            data,
            call_box: Box::new(call_box),
        }
    }

    // 實(shí)現(xiàn)call_box方法
    fn call_box(&mut self) {
        (self.call_box)();
    }
}

fn main() {
    const NUMBER_OF_WORKERS: usize = 4; // 假設(shè)有4個(gè)工作線程
    let (tx, rx) = channel::unbounded::<Task>();
    let mut handlers = vec![];

    // 啟動(dòng)工作線程
    for _ in 0..NUMBER_OF_WORKERS {
        let rx = rx.clone();
        let handle = thread::spawn(move || {
            while let Some(task) = rx.recv() {
                task.call_box(); // 執(zhí)行任務(wù)
            }
        });
        handlers.push(handle);
    }

    // 發(fā)送任務(wù)到通道
    for i in 0..10 { // 假設(shè)發(fā)送10個(gè)任務(wù)
        let task = Task::new(i, || {
            println!("Executing task with data: {}", i);
            sleep(Duration::from_secs(1)); // 模擬耗時(shí)操作
            println!("Finished task with data: {}", i);
        });
        tx.send(task).unwrap();
    }

    // 關(guān)閉發(fā)送通道
    drop(tx);

    // 等待所有工作線程完成
    for handle in handlers {
        handle.join().unwrap();
    }

    println!("All tasks are processed.");
}

在這個(gè)程序中,我們定義了一個(gè)Task結(jié)構(gòu)體,它包含一個(gè)data字段和一個(gè)call_box字段,后者是一個(gè)裝箱的可調(diào)用對象。我們實(shí)現(xiàn)了call_box方法,它調(diào)用這個(gè)裝箱的可調(diào)用對象。

main函數(shù)中,我們創(chuàng)建了一個(gè)無界通道,用于在工作線程和主線程之間傳遞Task實(shí)例。我們啟動(dòng)了NUMBER_OF_WORKERS個(gè)工作線程,它們不斷地從通道接收Task實(shí)例并調(diào)用call_box方法執(zhí)行它們。

然后,主線程創(chuàng)建了一些Task實(shí)例,并通過通道發(fā)送它們給工作線程。一旦所有任務(wù)都被發(fā)送,主線程通過drop(tx)關(guān)閉了發(fā)送通道,這樣工作線程在嘗試接收任務(wù)時(shí),如果沒有更多任務(wù)可用,將會(huì)得到一個(gè)None,從而退出循環(huán)。

最后,主線程等待所有工作線程完成,并打印出消息表示所有任務(wù)都已經(jīng)處理完畢。

請注意,為了簡化示例,我使用了Box<dyn FnMut()>來允許Task存儲(chǔ)任何可調(diào)用對象的裝箱指針。這意味著任務(wù)中的可調(diào)用對象必須能夠單獨(dú)編譯成一個(gè)獨(dú)立的、無狀態(tài)的函數(shù),這樣才能安全地在多個(gè)線程之間共享。在實(shí)際應(yīng)用中,你可能需要根據(jù)你的具體需求調(diào)整Task結(jié)構(gòu)體的設(shè)計(jì)和使用方式。文章來源地址http://www.zghlxwxcb.cn/news/detail-840029.html

到了這里,關(guān)于Rust 并行庫 crossbeam 的 Channel 示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Rust多線程編程

    rust標(biāo)準(zhǔn)庫中提供了線程相關(guān)支持,直接引用即可使用: 使用spawn方法創(chuàng)建一個(gè)線程。如: 創(chuàng)建后線程自動(dòng)運(yùn)行: 默認(rèn)的spawn方法傳遞不了參數(shù)。如果要為線程傳遞參數(shù),需要使用匿名函數(shù)作為spawn的參數(shù),匿名函數(shù)也稱為閉包。 閉包(匿名函數(shù)) 閉包的基本語法: 使用閉包

    2024年02月11日
    瀏覽(24)
  • rust學(xué)習(xí)-線程

    Rust 標(biāo)準(zhǔn)庫只提供了 1:1 線程模型 Rust 是較為底層的語言,如果愿意犧牲性能來換取抽象,以獲得對線程運(yùn)行更精細(xì)的控制及更低的上下文切換成本,使用實(shí)現(xiàn)了 M:N 線程模型的 crate 在參數(shù)列表前使用 move 強(qiáng)制閉包獲取其使用的環(huán)境值的所有權(quán)。 這個(gè)技巧在創(chuàng)建新線程

    2024年02月16日
    瀏覽(12)
  • Rust語言之多線程

    多線程 是一種并發(fā)執(zhí)行的技術(shù),它允許一個(gè)程序或進(jìn)程同時(shí)執(zhí)行多個(gè)線程。每個(gè)線程都是程序執(zhí)行的一個(gè)獨(dú)立路徑,它們可以并行運(yùn)行,共享進(jìn)程的資源(如內(nèi)存空間),但每個(gè)線程有自己的指令指針、堆棧和局部變量。多線程的主要目的是提高程序的執(zhí)行效率,通過同時(shí)執(zhí)

    2024年02月22日
    瀏覽(14)
  • [Rust GUI]eframe(egui框架)代碼示例

    [Rust GUI]eframe(egui框架)代碼示例

    你可以使用egui的其他綁定,例如:egui-miniquad,bevy_egui,egui_sdl2_gl 等。 egui庫相當(dāng)于核心庫,需要借助eframe框架寫界面。 eframe使用egui_glow渲染,而egui_glow需要opengl2.0+。 1、訪問微軟官網(wǎng)下載生成工具 2、勾選這個(gè) 3、對比勾選細(xì)節(jié) 4、點(diǎn)擊安裝 5、安裝完成 6、關(guān)閉 Visual Studio

    2024年02月08日
    瀏覽(22)
  • 【Rabbitmq】報(bào)錯(cuò):ERROR CachingConnectionFactory Channel shutdown: channel error;

    報(bào)錯(cuò)內(nèi)容 ERROR CachingConnectionFactory Channel shutdown: channel error; protocol method: #methodchannel.close(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80) 原因? ?默認(rèn)是自動(dòng)ack,然后你代碼又手動(dòng)ack,導(dǎo)致ack了兩次,報(bào)了錯(cuò)。 解決辦法 ?配置文件設(shè)置為手動(dòng)ack

    2024年02月16日
    瀏覽(21)
  • 面試某大廠,被Channel給吊打了,這次一次性通關(guān)channel!

    目錄 一 前言 面試題 然后我們進(jìn)行一下擴(kuò)展,玩轉(zhuǎn)Channel! 二 解決面試題 1. 介紹一下Channel 2. Channel在go中起什么作用 3. Channel為什么需要兩個(gè)隊(duì)列實(shí)現(xiàn) 4. Go為什么要開發(fā)Channel,而別的語言為什么沒有 5. Channel底層是使用鎖控制并發(fā)的,為什么不直接使用鎖 三 擴(kuò)展面試題 1.

    2023年04月13日
    瀏覽(20)
  • 創(chuàng)建應(yīng)用通道失敗: create channel failed: create channel failed:

    創(chuàng)建應(yīng)用通道失敗: create channel failed: create channel failed: SendEnvelope failed: calling orderer ‘localhost:7050’ failed: Orderer Client Status Code: (2) CONNECTION_FAILED. Description: dialing connection on target [localhost:7050]: connection is in TRANSIENT_FAILURE 這個(gè)錯(cuò)誤通常是因?yàn)榭蛻舳藷o法連接到Orderer節(jié)點(diǎn)導(dǎo)致的。一

    2024年02月03日
    瀏覽(18)
  • rust寫一個(gè)多線程和協(xié)程的例子

    當(dāng)涉及到多線程和協(xié)程時(shí),Rust提供了一些非常強(qiáng)大的工具,其中最常用的庫之一是 tokio ,它用于異步編程和協(xié)程。下面我將為你展示一個(gè)簡單的Rust程序,演示如何使用多線程和協(xié)程。 首先,你需要在你的項(xiàng)目的 Cargo.toml 文件中添加 tokio 庫的依賴: [dependencies] tokio = { versi

    2024年02月11日
    瀏覽(19)
  • Rust 實(shí)現(xiàn)線程安全的 Lock Free 計(jì)數(shù)器

    完整代碼:https://github.com/chiehw/hello_rust/blob/main/crates/counter/src/lib.rs Trait 可以看作是一種 能力的抽象 ,和接口有點(diǎn)類似。Trait 還能作為 泛型約束條件 ,作為參數(shù)的限制條件。 使用測試驅(qū)動(dòng)開發(fā)可以讓目標(biāo)更明確,這里先寫個(gè)簡單的測試案例。 直接封裝 AtomicUsize 使用多線程

    2024年04月13日
    瀏覽(14)
  • C#基礎(chǔ)--線程Thread和線程池ThreadPool

    C#基礎(chǔ)--線程Thread和線程池ThreadPool

    1. 開啟一個(gè)線程 ThreadStart 是屬于System.Threading 中的一個(gè)內(nèi)置委托 ParameterizedThreadStart 是屬于System.Threading 中的一個(gè)內(nèi)置委托 2. 暫停/恢復(fù)線程 無法實(shí)時(shí)的去 “暫停 ” 或者 “恢復(fù)” 線程,因?yàn)榫€程是由系統(tǒng)調(diào)度執(zhí)行的,而且中間存在一個(gè)延時(shí)現(xiàn)象,不可能直接幫你執(zhí)行 3. 終結(jié)

    2024年02月16日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包