Tokio 無(wú)疑是 Rust 世界中最優(yōu)秀的異步Runtime實(shí)現(xiàn)。非阻塞的特性帶來(lái)了優(yōu)異的性能,但是在實(shí)際的開(kāi)發(fā)中我們往往需要在某些情況下阻塞任務(wù)來(lái)實(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)是通過(guò)異步任務(wù)打印出99個(gè) “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í)行完后面就沒(méi)有輸出了,如果把max_task設(shè)置為2,情況會(huì)好一點(diǎn),但是也沒(méi)有執(zhí)行完所有的異步操作,也就是說(shuō)在資源不足的情況下,Tokio會(huì)拋棄某些任務(wù),這不符合我們的預(yù)期。那么能不能再達(dá)到了某一閥值的情況下阻塞一下,不再給Tokio新的任務(wù)呢。這有點(diǎn)類(lèi)似線程池,當(dāng)達(dá)達(dá)最大線程數(shù)的時(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來(lái)管理派生出來(lái)的任務(wù)。set.join_next().await; 保證至少一個(gè)任務(wù)被執(zhí)行完成。結(jié)合set的len,我們可以在任務(wù)達(dá)到上限時(shí)阻塞任務(wù)派生。當(dāng)循環(huán)結(jié)束,可能還有未完成的任務(wù),所以只要set.len()大于0就等待任務(wù)結(jié)束。輸出大概長(zhǎng)這樣
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é)可以動(dòng)手嘗試一下。審核編輯 :李倩
-
線程池
+關(guān)注
關(guān)注
0文章
57瀏覽量
6893 -
非阻塞
+關(guān)注
關(guān)注
0文章
13瀏覽量
2194 -
Rust
+關(guān)注
關(guān)注
1文章
230瀏覽量
6665 -
Tokio
+關(guān)注
關(guān)注
0文章
12瀏覽量
70
原文標(biāo)題:文盤(pán)Rust -- 用Tokio實(shí)現(xiàn)簡(jiǎn)易任務(wù)池
文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論