Tokio 無疑是 Rust 世界中最優(yōu)秀的異步Runtime實(shí)現(xiàn)。非阻塞的特性帶來了優(yōu)異的性能,但是在實(shí)際的開發(fā)中我們往往需要在某些情況下阻塞任務(wù)來實(shí)現(xiàn)某些功能。
我們看看下面的例子
fn main(){
let max_task = 1;
let rt = runtime::new_multi_thread()
.worker_threads(max_task)
.build()
.unwrap();
rt.block_on(async {
println!("tokio_multi_thread ");
for i in 0..100 {
println!("run {}", i);
tokio::spawn(async move {
println!("spawn {}", i);
thread::from_secs(2));
});
}
});
}
我們期待的運(yùn)行結(jié)構(gòu)是通過異步任務(wù)打印出99個 “spawn i",但實(shí)際輸出的結(jié)果大概這樣
tokio_multi_thread
run 0
run 1
run 2
.......
run 16
spawn 0
run 17
......
run 99
spawn 1
spawn 2
......
spawn 29
......
spawn 58
spawn 59
59執(zhí)行完后面就沒有輸出了,如果把max_task設(shè)置為2,情況會好一點(diǎn),但是也沒有執(zhí)行完所有的異步操作,也就是說在資源不足的情況下,Tokio會拋棄某些任務(wù),這不符合我們的預(yù)期。那么能不能再達(dá)到了某一閥值的情況下阻塞一下,不再給Tokio新的任務(wù)呢。這有點(diǎn)類似線程池,當(dāng)達(dá)達(dá)最大線程數(shù)的時候阻塞后面的任務(wù)待有釋放的線程后再繼續(xù)。我們看看下面的代碼。
fn main(){
let max_task = 2;
let rt = runtime::new_multi_thread()
.worker_threads(max_task)
.enable_time()
.build()
.unwrap();
let mut set = JoinSet::new();
rt.block_on(async {
for i in 0..100 {
println!("run {}", i);
while set.len() >= max_task {
set.join_next().await;
}
set.spawn(async move {
sleep().await;
println!("spawn {}", i);
});
}
while set.len() > 0 {
set.join_next().await;
}
});
}
我們使用JoinSet來管理派生出來的任務(wù)。set.join_next().await; 保證至少一個任務(wù)被執(zhí)行完成。結(jié)合set的len,我們可以在任務(wù)達(dá)到上限時阻塞任務(wù)派生。當(dāng)循環(huán)結(jié)束,可能還有未完成的任務(wù),所以只要set.len()大于0就等待任務(wù)結(jié)束。輸出大概長這樣
running 1 test
tokio_multi_thread
run 0
run 1
spawn 0
run 2
spawn 1
......
run 31
spawn 30
run 32
spawn 31
run 33
......
run 96
spawn 95
run 97
spawn 96
run 98
spawn 97
run 99
spawn 98
spawn 99
符合預(yù)期,代碼不多,有興趣的同學(xué)可以動手嘗試一下。審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
線程池
+關(guān)注
關(guān)注
0文章
58瀏覽量
7388 -
非阻塞
+關(guān)注
關(guān)注
0文章
13瀏覽量
2381 -
Rust
+關(guān)注
關(guān)注
1文章
240瀏覽量
7583 -
Tokio
+關(guān)注
關(guān)注
0文章
12瀏覽量
258
原文標(biāo)題:文盤Rust -- 用Tokio實(shí)現(xiàn)簡易任務(wù)池
文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
SQLx在Rust語言中的基礎(chǔ)用法和進(jìn)階用法
SQLx是一個Rust語言的異步SQL執(zhí)行庫,它支持多種數(shù)據(jù)庫,包括MySQL、PostgreSQL、SQLite等。本教程將以MySQL數(shù)據(jù)庫為例,介紹SQLx在Rust語言中的基礎(chǔ)用法和進(jìn)階用法
什么是Tokio模塊 Channel?
Rust 語言是一種系統(tǒng)級編程語言,它具有強(qiáng)類型和內(nèi)存安全性。Rust 語言中的 Tokio 模塊是一個異步編程庫,它提供了一種高效的方式來處理異步任務(wù)。其中,channel 是
使用tokio實(shí)現(xiàn)一個簡單的Client和Server通訊模型
本系列是關(guān)于用Rust構(gòu)建一個KV Server的系列文章,內(nèi)容包括用tokio做底層異步網(wǎng)絡(luò)通訊、使用toml文件做配置、protobuf做傳輸協(xié)議、內(nèi)存/RockDB做數(shù)據(jù)存儲、事
如何用Rust構(gòu)建一個KV Server系列
本系列是關(guān)于用Rust構(gòu)建一個KV Server的系列文章,內(nèi)容包括用tokio做底層異步網(wǎng)絡(luò)通訊、使用toml文件做配置、protobuf做傳輸協(xié)議、內(nèi)存/RockDB做數(shù)據(jù)存儲、事
WasmEdge增加了Tokio支持
WasmEdge 成功地移植了 tokio(一個 Rust 異步運(yùn)行時)到 Wasm:https://github.com/WasmEdge/tokio。其秘
文盤Rust--r2d2實(shí)現(xiàn)redis連接池
我們在開發(fā)應(yīng)用后端系統(tǒng)的時候經(jīng)常要和各種數(shù)據(jù)庫、緩存等資源打交道。這一期,我們聊聊如何訪問redis 并將資源池化。
文盤Rust -- rust連接oss
我們以 [S3 sdk](https://github.com/awslabs/aws-sdk-rust)為例來說說基本的連接與操作,作者驗(yàn)證過aws、京東云、阿里云。主要的增刪改查功能沒有什么差別。
文盤Rust -- tokio綁定cpu實(shí)踐
)。core_affinity_rs是一個用于管理CPU親和力的Rust crate。目前支持Linux、Mac OSX和Windows。官方宣稱支持多平臺,本人只做了linux 操作系統(tǒng)的測試。
Tokio 模塊的優(yōu)雅停機(jī)機(jī)制
的講解。 Tokio 模塊簡介 Tokio 是 Rust 語言中的異步編程框架,它提供了一些基礎(chǔ)的異步編程工具,如異步 IO、任務(wù)調(diào)度等。Tokio
如何使用Tokio 和 Tracing模塊構(gòu)建異步的網(wǎng)絡(luò)應(yīng)用程序
在 Rust 語言中,Tokio 是一個非常流行的異步運(yùn)行時,它提供了高效的異步 I/O 操作和任務(wù)調(diào)度。而 Tracing 則是一個用于應(yīng)用程序跟蹤的框架,它可以幫助我們理解應(yīng)用程序的行為和性能
如何使用 Tokio 模塊的Channel
Channel 是一種在多線程環(huán)境下進(jìn)行通信的機(jī)制,可以讓線程之間互相發(fā)送消息和共享數(shù)據(jù)。Rust 語言中的 Tokio 模塊提供了一種異步的 Channel 實(shí)現(xiàn),使得我們可以在異步程序中方
tokio模塊channel中的使用場景和優(yōu)缺點(diǎn)
以讓不同的線程之間通過發(fā)送和接收消息來傳遞數(shù)據(jù),從而實(shí)現(xiàn)線程之間的協(xié)作和同步。 在 Rust 語言中,tokio 模塊的 channel 組件提供了
Tokio 的基本用法
Tokio 是一個異步 I/O 框架,它提供了一種高效的方式來編寫異步代碼。它使用 Rust 語言的 Futures 庫來管理異步任務(wù),并使用 Reactor 模式來處理 I/O 事件。 本系
Channel模塊的使用方法示例
Rust 語言中的 Tokio 模塊是一個異步編程庫,它提供了一種高效的方式來處理異步任務(wù)。其中,channel 是 Tokio 模塊中的一個重要組成部分,它可以用于在異步
高并發(fā)內(nèi)存池項(xiàng)目實(shí)現(xiàn)
本項(xiàng)目實(shí)現(xiàn)了一個高并發(fā)內(nèi)存池,參考了Google的開源項(xiàng)目tcmalloc實(shí)現(xiàn)的簡易版;其功能就是實(shí)現(xiàn)高效的多線程內(nèi)存管理。由功能可知,高并
文盤Rust -- 用Tokio實(shí)現(xiàn)簡易任務(wù)池
評論