在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

文盤Rust -- 用Tokio實現簡易任務池

jf_wN0SrCdH ? 來源:Rust語言中文社區 ? 2023-04-09 10:24 ? 次閱讀

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

    瀏覽量

    7095
  • 非阻塞
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2259
  • Rust
    +關注

    關注

    1

    文章

    233

    瀏覽量

    6975
  • Tokio
    +關注

    關注

    0

    文章

    12

    瀏覽量

    159

原文標題:文盤Rust -- 用Tokio實現簡易任務池

文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    SQLx在Rust語言中的基礎用法和進階用法

    SQLx是一個Rust語言的異步SQL執行庫,它支持多種數據庫,包括MySQL、PostgreSQL、SQLite等。本教程將以MySQL數據庫為例,介紹SQLx在Rust語言中的基礎用法和進階用法
    的頭像 發表于 09-19 14:32 ?6005次閱讀

    什么是Tokio模塊 Channel?

    Rust 語言是一種系統級編程語言,它具有強類型和內存安全性。Rust 語言中的 Tokio 模塊是一個異步編程庫,它提供了一種高效的方式來處理異步任務。其中,channel 是
    的頭像 發表于 09-19 15:57 ?1261次閱讀

    使用tokio實現一個簡單的Client和Server通訊模型

    本系列是關于Rust構建一個KV Server的系列文章,內容包括tokio做底層異步網絡通訊、使用toml文件做配置、protobuf做傳輸協議、內存/RockDB做數據存儲、事
    的頭像 發表于 09-09 09:45 ?2599次閱讀

    如何用Rust構建一個KV Server系列

    本系列是關于Rust構建一個KV Server的系列文章,內容包括tokio做底層異步網絡通訊、使用toml文件做配置、protobuf做傳輸協議、內存/RockDB做數據存儲、事
    的頭像 發表于 09-14 10:03 ?1496次閱讀

    WasmEdge增加了Tokio支持

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

    Rust--r2d2實現redis連接

    我們在開發應用后端系統的時候經常要和各種數據庫、緩存等資源打交道。這一期,我們聊聊如何訪問redis 并將資源化。
    的頭像 發表于 12-12 10:32 ?1058次閱讀

    Rust -- rust連接oss

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

    Rust -- tokio綁定cpu實踐

    )。core_affinity_rs是一個用于管理CPU親和力的Rust crate。目前支持Linux、Mac OSX和Windows。官方宣稱支持多平臺,本人只做了linux 操作系統的測試。
    的頭像 發表于 06-11 15:32 ?765次閱讀
    <b class='flag-5'>文</b><b class='flag-5'>盤</b><b class='flag-5'>Rust</b> -- <b class='flag-5'>tokio</b>綁定cpu實踐

    Tokio 模塊的優雅停機機制

    的講解。 Tokio 模塊簡介 TokioRust 語言中的異步編程框架,它提供了一些基礎的異步編程工具,如異步 IO、任務調度等。Tokio
    的頭像 發表于 09-19 15:26 ?906次閱讀

    如何使用Tokio 和 Tracing模塊構建異步的網絡應用程序

    Rust 語言中,Tokio 是一個非常流行的異步運行時,它提供了高效的異步 I/O 操作和任務調度。而 Tracing 則是一個用于應用程序跟蹤的框架,它可以幫助我們理解應用程序的行為和性能
    的頭像 發表于 09-19 15:29 ?1004次閱讀

    如何使用 Tokio 模塊的Channel

    Channel 是一種在多線程環境下進行通信的機制,可以讓線程之間互相發送消息和共享數據。Rust 語言中的 Tokio 模塊提供了一種異步的 Channel 實現,使得我們可以在異步程序中方
    的頭像 發表于 09-19 15:38 ?932次閱讀

    tokio模塊channel中的使用場景和優缺點

    以讓不同的線程之間通過發送和接收消息來傳遞數據,從而實現線程之間的協作和同步。 在 Rust 語言中,tokio 模塊的 channel 組件提供了
    的頭像 發表于 09-19 15:54 ?1165次閱讀

    Tokio 的基本用法

    Tokio 是一個異步 I/O 框架,它提供了一種高效的方式來編寫異步代碼。它使用 Rust 語言的 Futures 庫來管理異步任務,并使用 Reactor 模式來處理 I/O 事件。 本系
    的頭像 發表于 09-19 16:05 ?1073次閱讀

    Channel模塊的使用方法示例

    Rust 語言中的 Tokio 模塊是一個異步編程庫,它提供了一種高效的方式來處理異步任務。其中,channel 是 Tokio 模塊中的一個重要組成部分,它可以用于在異步
    的頭像 發表于 09-20 11:47 ?1417次閱讀

    高并發內存項目實現

    本項目實現了一個高并發內存,參考了Google的開源項目tcmalloc實現簡易版;其功能就是實現高效的多線程內存管理。由功能可知,高并
    的頭像 發表于 11-09 11:16 ?974次閱讀
    高并發內存<b class='flag-5'>池</b>項目<b class='flag-5'>實現</b>
    主站蜘蛛池模板: 亚洲国产精品婷婷久久 | 777奇米影视笫四色88me久久综合 | 永久黄网站色视频免费观看99 | 国产午夜在线观看视频 | 377p亚洲欧洲日本大胆色噜噜 | 一区二区三区欧美在线 | 黑森林福利视频导航 | 国产综合在线视频 | 激情深爱五月 | 久久综合成人网 | 久久天天躁夜夜躁狠狠85麻豆 | 欧美高清milf在线播放 | 五月天免费在线播放 | 扒开双腿猛进入jk校视频 | 人人爱天天做夜夜爽毛片 | 大黄香蕉 | 国产免费人成在线视频视频 | 欧美成人伊人久久综合网 | 色综合狠狠操 | 69日本xxⅹxxxxx18 | 麻豆国产一区二区在线观看 | 香港午夜理理伦_级毛片 | 欧亚精品卡一卡二卡三 | baoyu777永久免费视频 | se在线播放| 欧美私人网站 | 国产高清成人mv在线观看 | 夜色成人 | 亚洲黄网在线 | 五月婷综合网 | www.色婷婷| 热久久久 | 日韩三级精品 | baoyu168成人免费视频 | 琪琪午夜免费影院在线观看 | 好爽毛片一区二区三区四区 | 婷婷色5月 | 亚洲第一伊人 | 在线a亚洲老鸭窝天堂新地址 | 欧美性精品 | 欧美最猛性xxxx免费 |