在线观看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

    瀏覽量

    6861
  • 非阻塞
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2187
  • Rust
    +關注

    關注

    1

    文章

    229

    瀏覽量

    6619
  • Tokio
    +關注

    關注

    0

    文章

    12

    瀏覽量

    65

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

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

收藏 人收藏

    評論

    相關推薦

    什么是Tokio模塊 Channel?

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

    線程是如何實現

    線程的概念是什么?線程是如何實現的?
    發表于 02-28 06:20

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

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

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

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

    WasmEdge增加了Tokio支持

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

    Rust--r2d2實現redis連接

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

    Rust -- rust連接oss

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

    Rust -- tokio綁定cpu實踐

    )。core_affinity_rs是一個用于管理CPU親和力的Rust crate。目前支持Linux、Mac OSX和Windows。官方宣稱支持多平臺,本人只做了linux 操作系統的測試。
    的頭像 發表于 06-11 15:32 ?572次閱讀
    <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 ?649次閱讀

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

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

    如何使用 Tokio 模塊的Channel

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

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

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

    Tokio 的基本用法

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

    Channel模塊的使用方法示例

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

    高并發內存項目實現

    本項目實現了一個高并發內存,參考了Google的開源項目tcmalloc實現簡易版;其功能就是實現高效的多線程內存管理。由功能可知,高并
    的頭像 發表于 11-09 11:16 ?728次閱讀
    高并發內存<b class='flag-5'>池</b>項目<b class='flag-5'>實現</b>
    主站蜘蛛池模板: 国内a级毛片免费···| 天天综合网天天做天天受| 美女免费黄| 亚洲成a人片77777kkk| 一区二区三区午夜| 51成人网| 天天爽夜夜爽人人爽一区二区| 天天操夜夜噜| 国产精品夜夜春夜夜爽| 啪啪网站免费看| 亚洲码欧美码一区二区三区| jiucao视频在线观看| 日本乱妇| 欧美一区亚洲二区| 亚洲怡红院在线| 一区二区三区四区无限乱码在线观看| 综合欧美一区二区三区| 嫩草网| 亚洲综合激情网| 色视频在线免费看| 久久九九国产精品怡红院| 欧美福利精品| 国产在线五月综合婷婷| 呦交小u女国产秘密入口| 欧美成人三级网站| 欧美67194| 在线观看h网站| 久99频这里只精品23热 视频| 亚洲国产精品嫩草影院| 一级特黄aa大片免费| 色网站综合| 狠狠色狠狠色综合日日小蛇| 夜夜澡人人爽人人喊_欧美| 综合网视频| 免费国产午夜在线观看| abc119影院成人免费看| 丁香激情综合| 亚洲综合情| 久青草免费视频手机在线观看| 久久美女精品国产精品亚洲| 在线免费看黄的网站|