日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務,提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

tokio 是 Rust 生態(tài)中流行的異步運行時框架。在實際生產(chǎn)中我們如果希望 tokio 應用程序與特定的 cpu core 綁定該怎么處理呢?這次我們來聊聊這個話題。

首先我們先寫一段簡單的多任務程序。

use tokio::runtime;

pub fn mAIn() {

let rt = runtime::Builder::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);

}

});

}

});

}

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

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

可以看到每個 core 都有負載。

要想把負載綁定在某一 core 上,需要使用 core_affinity_rs。core_affinity_rs 是一個用于管理 CPU 親和力的 Rust crate。目前支持 linux、mac OSX 和 windows。官方宣稱支持多平臺,本人只做了 linux 操作系統(tǒng)的測試。

我們把代碼修改一下:

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::Builder::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);

}

});

}

});

}

在構建多線程 runtime 時,在 on_thread_start 設置 cpu 親和。可以看到負載被綁定到了指定的 core 上。

上面的代碼只是把負載綁定到了一個 core 上,那么要綁定多個核怎么辦呢?

我們看看下面的代碼

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);

}

});

}

});

}

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

本期關于 cpu 親和的話題就聊到這兒,下期見

 

作者:京東科技 賈世聞
來源:京東云開發(fā)者社區(qū)

分享到:
標簽:Rust
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定