色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

文盤(pán)Rust -- tokio綁定cpu實(shí)踐

jf_wN0SrCdH ? 來(lái)源:Rust語(yǔ)言中文社區(qū) ? 2023-06-11 15:32 ? 次閱讀

tokio 是 rust 生態(tài)中流行的異步運(yùn)行框架。在實(shí)際生產(chǎn)中我們?nèi)绻M?tokio 應(yīng)用程序與特定的 cpu core 綁定該怎么處理呢?這次我們來(lái)聊聊這個(gè)話(huà)題

首先我們先寫(xiě)一段簡(jiǎn)單的多任務(wù)程序。

use tokio::runtime;
pub fn main() {
    let rt = runtime::new_multi_thread()
        .enable_all()
        .build()
        .unwrap();


    rt.block_on(async {
        for i in 0..8 {
            println!("num {}", i);
            tokio::spawn(async move {
                loop {
                    let mut sum: i32 = 0;
                    for i in 0..100000000 {
                        sum = sum.overflowing_add(i).0;
                    }
                    println!("sum {}", sum);
                }
            });
        }
    });
}

程序非常簡(jiǎn)單,首先構(gòu)造一個(gè)tokio runtime 環(huán)境,然后派生多個(gè) tokio 并發(fā),每個(gè)并發(fā)執(zhí)行一個(gè)無(wú)限循環(huán)做overflowing_add。overflowing_add函數(shù)返回一個(gè)加法的元組以及一個(gè)表示是否會(huì)發(fā)生算術(shù)溢出的布爾值。如果會(huì)發(fā)生溢出,那么將返回包裝好的值。然后取元祖的第一個(gè)元素打印。

這個(gè)程序運(yùn)行在 Ubuntu 20 OS,4 core cpu。通過(guò)nmon的監(jiān)控如下:

326c77c2-0735-11ee-962d-dac502259ad0.png

可以看到每個(gè) core 都有負(fù)載。

要想把負(fù)載綁定在某一 core 上,需要使用core_affinity_rs(https://github.com/Elzair/core_affinity_rs)。core_affinity_rs是一個(gè)用于管理CPU親和力的Rust crate。目前支持Linux、Mac OSX和Windows。官方宣稱(chēng)支持多平臺(tái),本人只做了linux 操作系統(tǒng)的測(cè)試。

我們把代碼修改一下:

use tokio::runtime;


pub fn main() {
    let core_ids = core_affinity::get_core_ids().unwrap();
    println!("core num {}", core_ids.len());
    let core_id = core_ids[1];


    let rt = runtime::new_multi_thread()
        .on_thread_start(move || {
            core_affinity::set_for_current(core_id.clone());
        })
        .enable_all()
        .build()
        .unwrap();


    rt.block_on(async {
        for i in 0..8 {
            println!("num {}", i);
            tokio::spawn(async move { 
                loop {
                    let mut sum: i32 = 0;
                    for i in 0..100000000 {
                        sum = sum.overflowing_add(i).0;
                    }
                    println!("sum {}", sum);           
                }
            });
        }
    });
}

在構(gòu)建多線(xiàn)程runtime時(shí),在on_thread_start 設(shè)置cpu親和。可以看到負(fù)載被綁定到了指定的core上。

3280fcf6-0735-11ee-962d-dac502259ad0.png

上面的代碼只是把負(fù)載綁定到了一個(gè)core上,那么要綁定多個(gè)核怎么辦呢

我們看看下面的代碼

pub fn main() {
    let core_ids = core_affinity::get_core_ids().unwrap();
    println!("core num {}", core_ids.len());


    let rt = runtime::Builder::new_multi_thread()
        .enable_all()
        .build()
        .unwrap();


    let mut idx = 2;


    rt.block_on(async {
        for i in 0..8 {
            println!("num {}", i);
            let core_id = core_ids[idx];
            if idx.eq(&(core_ids.len() - 1)) {
                idx = 2;
            } else {
                idx += 1;
            }


            tokio::spawn(async move {
                let res = core_affinity::set_for_current(core_id);
                println!("{}", res);
                loop {
                    let mut sum: i32 = 0;
                    for i in 0..100000000 {
                        sum = sum.overflowing_add(i).0;
                    }
                    println!("sum {}", sum);
                    }
            });
        }
    });
}

代碼需要把所有負(fù)載綁在 core3和core4上。原理是在派生任務(wù)中加入 core_affinity 設(shè)置.通過(guò)調(diào)整idx,將派生并發(fā)平均綁定在指定的core上。代碼運(yùn)行的監(jiān)控如下圖。

32a29956-0735-11ee-962d-dac502259ad0.png

本期關(guān)于cpu親和的話(huà)題就聊到這兒,下期見(jiàn)


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3271

    瀏覽量

    57723
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    229

    瀏覽量

    6613
  • Tokio
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    64

原文標(biāo)題:文盤(pán)Rust -- tokio綁定cpu實(shí)踐

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux進(jìn)程怎么綁定CPU

    昨天在群里有朋友問(wèn):把進(jìn)程綁定到某個(gè) CPU 上運(yùn)行是怎么實(shí)現(xiàn)的。
    發(fā)表于 10-26 10:26 ?1860次閱讀

    SQLx在Rust語(yǔ)言中的基礎(chǔ)用法和進(jìn)階用法

    SQLx是一個(gè)Rust語(yǔ)言的異步SQL執(zhí)行庫(kù),它支持多種數(shù)據(jù)庫(kù),包括MySQL、PostgreSQL、SQLite等。本教程將以MySQL數(shù)據(jù)庫(kù)為例,介紹SQLx在Rust語(yǔ)言中的基礎(chǔ)用法和進(jìn)階用法
    的頭像 發(fā)表于 09-19 14:32 ?5312次閱讀

    什么是Tokio模塊 Channel?

    Rust 語(yǔ)言是一種系統(tǒng)級(jí)編程語(yǔ)言,它具有強(qiáng)類(lèi)型和內(nèi)存安全性。Rust 語(yǔ)言中的 Tokio 模塊是一個(gè)異步編程庫(kù),它提供了一種高效的方式來(lái)處理異步任務(wù)。其中,channel 是 Tokio
    的頭像 發(fā)表于 09-19 15:57 ?966次閱讀

    Rust GUI實(shí)踐Rust-Qt模塊

    Rust-Qt 是 Rust 語(yǔ)言的一個(gè) Qt 綁定庫(kù),它允許 Rust 開(kāi)發(fā)者使用 Qt 框架來(lái)創(chuàng)建跨平臺(tái)的圖形界面應(yīng)用程序。Qt 是一個(gè)跨平臺(tái)的應(yīng)用程序框架,它提供了一系列的工具和
    的頭像 發(fā)表于 09-30 16:43 ?1601次閱讀

    把進(jìn)程綁定到某個(gè) CPU 上運(yùn)行是怎么實(shí)現(xiàn)?

    昨天在群里有朋友問(wèn):把進(jìn)程綁定到某個(gè) CPU 上運(yùn)行是怎么實(shí)現(xiàn)的。 首先,我們先來(lái)了解下將進(jìn)程與 CPU 進(jìn)行綁定的好處。 進(jìn)程綁定
    的頭像 發(fā)表于 07-02 09:55 ?2422次閱讀

    移動(dòng)端arm cpu優(yōu)化學(xué)習(xí)筆記第3彈--綁定cpu(cpu affinity)

    本文主要內(nèi)容是介紹移動(dòng)端優(yōu)化會(huì)涉及到的綁定cpucpu affinity)[2,3]的概念和相關(guān)驗(yàn)證實(shí)驗(yàn)。 作者:梁德澎首發(fā)知乎:[鏈接]
    發(fā)表于 02-07 11:19 ?0次下載
    移動(dòng)端arm <b class='flag-5'>cpu</b>優(yōu)化學(xué)習(xí)筆記第3彈--<b class='flag-5'>綁定</b><b class='flag-5'>cpu</b>(<b class='flag-5'>cpu</b> affinity)

    WasmEdge增加了Tokio支持

    WasmEdge 成功地移植了 tokio(一個(gè) Rust 異步運(yùn)行時(shí))到 Wasm:https://github.com/WasmEdge/tokio。其秘
    的頭像 發(fā)表于 12-05 11:55 ?847次閱讀

    盤(pán)Rust -- 用Tokio實(shí)現(xiàn)簡(jiǎn)易任務(wù)池

    59執(zhí)行完后面就沒(méi)有輸出了,如果把max_task設(shè)置為2,情況會(huì)好一點(diǎn),但是也沒(méi)有執(zhí)行完所有的異步操作,也就是說(shuō)在資源不足的情況下,Tokio會(huì)拋棄某些任務(wù),這不符合我們的預(yù)期。
    的頭像 發(fā)表于 04-09 10:24 ?1315次閱讀

    盤(pán)Rust -- rust連接oss

    我們以 [S3 sdk](https://github.com/awslabs/aws-sdk-rust)為例來(lái)說(shuō)說(shuō)基本的連接與操作,作者驗(yàn)證過(guò)aws、京東云、阿里云。主要的增刪改查功能沒(méi)有什么差別。
    的頭像 發(fā)表于 05-12 16:18 ?597次閱讀

    Tokio 模塊的優(yōu)雅停機(jī)機(jī)制

    在進(jìn)行高并發(fā)、網(wǎng)絡(luò)編程時(shí),優(yōu)雅停機(jī)是一個(gè)非常重要的問(wèn)題。在 Rust 語(yǔ)言中,Tokio 是一個(gè)非常流行的異步編程框架,它提供了一些優(yōu)雅停機(jī)的機(jī)制,本文將圍繞 Tokio 模塊的優(yōu)雅停機(jī)進(jìn)行詳細(xì)
    的頭像 發(fā)表于 09-19 15:26 ?645次閱讀

    如何使用Tokio 和 Tracing模塊構(gòu)建異步的網(wǎng)絡(luò)應(yīng)用程序

    Rust 語(yǔ)言中,Tokio 是一個(gè)非常流行的異步運(yùn)行時(shí),它提供了高效的異步 I/O 操作和任務(wù)調(diào)度。而 Tracing 則是一個(gè)用于應(yīng)用程序跟蹤的框架,它可以幫助我們理解應(yīng)用程序的行為和性能
    的頭像 發(fā)表于 09-19 15:29 ?693次閱讀

    如何使用 Tokio 模塊的Channel

    Channel 是一種在多線(xiàn)程環(huán)境下進(jìn)行通信的機(jī)制,可以讓線(xiàn)程之間互相發(fā)送消息和共享數(shù)據(jù)。Rust 語(yǔ)言中的 Tokio 模塊提供了一種異步的 Channel 實(shí)現(xiàn),使得我們可以在異步程序中方
    的頭像 發(fā)表于 09-19 15:38 ?677次閱讀

    tokio模塊channel中的使用場(chǎng)景和優(yōu)缺點(diǎn)

    Rust 語(yǔ)言的 tokio 模塊提供了一種高效的異步編程方式,其中的 channel 模塊是其核心組件之一。本教程將介紹 tokio 模塊 channel 的除了上文提到的 mspc
    的頭像 發(fā)表于 09-19 15:54 ?802次閱讀

    Tokio 的基本用法

    Tokio 是一個(gè)異步 I/O 框架,它提供了一種高效的方式來(lái)編寫(xiě)異步代碼。它使用 Rust 語(yǔ)言的 Futures 庫(kù)來(lái)管理異步任務(wù),并使用 Reactor 模式來(lái)處理 I/O 事件。 本系
    的頭像 發(fā)表于 09-19 16:05 ?839次閱讀

    一次Rust重寫(xiě)基礎(chǔ)軟件的實(shí)踐

    受到2022年“谷歌使用Rust重寫(xiě)Android系統(tǒng)且所有Rust代碼的內(nèi)存安全漏洞為零” [1] 的啟發(fā),最近筆者懷著濃厚的興趣也順應(yīng)Rust 的潮流,嘗試著將一款C語(yǔ)言開(kāi)發(fā)的基礎(chǔ)軟件轉(zhuǎn)化
    的頭像 發(fā)表于 01-25 11:21 ?647次閱讀
    主站蜘蛛池模板: 人人草影院| 免费亚洲视频在线观看| 九九免费的视频| 午夜伦理 第1页| 成 人 网 站毛片| 欧美精品色婷婷五月综合| 最近日本免费观看MV免费| 久久精品国产亚洲AV影院| 一本到2v不卡区| 久久久无码精品一区二区三区| 美女pk精子2小游戏| 最新国产av.在线视频| 麻豆国产精品久久人妻| 69精品国产人妻蜜桃国产毛片| 狠很橹快播| 伊人久久亚洲精品一区| 老师湿乎乎两半嫩| 97草碰在线视频免费| 男女一边摸一边做羞羞的事情免费| 亚洲人成无码久久久AAA片| 解开白丝老师的短裙猛烈进入| 午夜男女爽爽羞羞影院在线观看| 公主纯肉高H文| 午夜福利自怕| 和姐姐做插得很深| 最新 国产 精品 精品 视频| 欧美18videosex初次| 嘟嘟嘟WWW在线观看视频高清| 热の中文 AV天堂| 国产成人精品三级在线| 亚洲不卡视频在线| 久久精品美女| mdapptv麻豆下载| 天天久久狠狠色综合| 好男人午夜www视频在线观看| 野草在线视频完整视频| 蜜芽资源高清在线观看| 成人国产精品玖玖热色欲| 午夜理论电影在线观看亚洲| 精品亚洲午夜久久久久| 99久久免费国产精精品|