Tokio 無疑是 Rust 世界中最優秀的異步Runtime實現。非阻塞的特性帶來了優異的性能,但是在實際的開發中我們往往需要在某些情況下阻塞任務來實現某些功能。
我們看看下面的例子
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));
});
}
});
}
我們期待的運行結構是通過異步任務打印出99個 “spawn i",但實際輸出的結果大概這樣
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執行完后面就沒有輸出了,如果把max_task設置為2,情況會好一點,但是也沒有執行完所有的異步操作,也就是說在資源不足的情況下,Tokio會拋棄某些任務,這不符合我們的預期。那么能不能再達到了某一閥值的情況下阻塞一下,不再給Tokio新的任務呢。這有點類似線程池,當達達最大線程數的時候阻塞后面的任務待有釋放的線程后再繼續。我們看看下面的代碼。
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來管理派生出來的任務。set.join_next().await; 保證至少一個任務被執行完成。結合set的len,我們可以在任務達到上限時阻塞任務派生。當循環結束,可能還有未完成的任務,所以只要set.len()大于0就等待任務結束。輸出大概長這樣
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
符合預期,代碼不多,有興趣的同學可以動手嘗試一下。審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
線程池
+關注
關注
0文章
57瀏覽量
6856 -
非阻塞
+關注
關注
0文章
13瀏覽量
2185 -
Rust
+關注
關注
1文章
229瀏覽量
6617 -
Tokio
+關注
關注
0文章
12瀏覽量
65
原文標題:文盤Rust -- 用Tokio實現簡易任務池
文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
什么是Tokio模塊 Channel?
Rust 語言是一種系統級編程語言,它具有強類型和內存安全性。Rust 語言中的 Tokio 模塊是一個異步編程庫,它提供了一種高效的方式來處理異步任務。其中,channel 是
使用tokio實現一個簡單的Client和Server通訊模型
本系列是關于用Rust構建一個KV Server的系列文章,內容包括用tokio做底層異步網絡通訊、使用toml文件做配置、protobuf做傳輸協議、內存/RockDB做數據存儲、事
如何用Rust構建一個KV Server系列
本系列是關于用Rust構建一個KV Server的系列文章,內容包括用tokio做底層異步網絡通訊、使用toml文件做配置、protobuf做傳輸協議、內存/RockDB做數據存儲、事
WasmEdge增加了Tokio支持
WasmEdge 成功地移植了 tokio(一個 Rust 異步運行時)到 Wasm:https://github.com/WasmEdge/tokio。其秘
文盤Rust--r2d2實現redis連接池
我們在開發應用后端系統的時候經常要和各種數據庫、緩存等資源打交道。這一期,我們聊聊如何訪問redis 并將資源池化。
文盤Rust -- rust連接oss
我們以 [S3 sdk](https://github.com/awslabs/aws-sdk-rust)為例來說說基本的連接與操作,作者驗證過aws、京東云、阿里云。主要的增刪改查功能沒有什么差別。
文盤Rust -- tokio綁定cpu實踐
)。core_affinity_rs是一個用于管理CPU親和力的Rust crate。目前支持Linux、Mac OSX和Windows。官方宣稱支持多平臺,本人只做了linux 操作系統的測試。
Tokio 模塊的優雅停機機制
的講解。 Tokio 模塊簡介 Tokio 是 Rust 語言中的異步編程框架,它提供了一些基礎的異步編程工具,如異步 IO、任務調度等。Tokio
如何使用Tokio 和 Tracing模塊構建異步的網絡應用程序
在 Rust 語言中,Tokio 是一個非常流行的異步運行時,它提供了高效的異步 I/O 操作和任務調度。而 Tracing 則是一個用于應用程序跟蹤的框架,它可以幫助我們理解應用程序的行為和性能
如何使用 Tokio 模塊的Channel
Channel 是一種在多線程環境下進行通信的機制,可以讓線程之間互相發送消息和共享數據。Rust 語言中的 Tokio 模塊提供了一種異步的 Channel 實現,使得我們可以在異步程序中方
tokio模塊channel中的使用場景和優缺點
以讓不同的線程之間通過發送和接收消息來傳遞數據,從而實現線程之間的協作和同步。 在 Rust 語言中,tokio 模塊的 channel 組件提供了
Tokio 的基本用法
Tokio 是一個異步 I/O 框架,它提供了一種高效的方式來編寫異步代碼。它使用 Rust 語言的 Futures 庫來管理異步任務,并使用 Reactor 模式來處理 I/O 事件。 本系
Channel模塊的使用方法示例
Rust 語言中的 Tokio 模塊是一個異步編程庫,它提供了一種高效的方式來處理異步任務。其中,channel 是 Tokio 模塊中的一個重要組成部分,它可以用于在異步
評論