色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    瀏覽量

    6856
  • 非阻塞
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2185
  • Rust
    +關注

    關注

    1

    文章

    229

    瀏覽量

    6617
  • Tokio
    +關注

    關注

    0

    文章

    12

    瀏覽量

    65

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

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

收藏 人收藏

    評論

    相關推薦

    什么是Tokio模塊 Channel?

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

    線程是如何實現

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

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

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

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

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

    WasmEdge增加了Tokio支持

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

    Rust--r2d2實現redis連接

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

    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 ?568次閱讀
    <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 ?647次閱讀

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

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

    如何使用 Tokio 模塊的Channel

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

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

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

    Tokio 的基本用法

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

    Channel模塊的使用方法示例

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

    高并發內存項目實現

    本項目實現了一個高并發內存,參考了Google的開源項目tcmalloc實現簡易版;其功能就是實現高效的多線程內存管理。由功能可知,高并
    的頭像 發表于 11-09 11:16 ?728次閱讀
    高并發內存<b class='flag-5'>池</b>項目<b class='flag-5'>實現</b>
    主站蜘蛛池模板: 失禁h啪肉尿出来高h| 男欢女爱免费视频| 把腿张开老子CAO烂你动态图| 99久久蜜臀亚洲AV无码精品| 成人短片迅雷下载| 国产高清砖码区| 精品国产5g影院天天爽| 奶大B紧17p| 8X拨牐拨牐X8免费视频8| 国产 亚洲 日韩 欧美 在线观看 | 亚洲日韩成人| a视频在线观看| 好爽胸大好深好多水| 美女伸开两腿让我爽| 色拍拍噜噜噜久久蜜桃| 亚洲精品中文字幕一二三四区| 97在线精品视频免费| 国产呻吟久久久久久久92| 美国一级黄色| 亚洲国产日韩欧美在线a乱码| qvod小电影| 久久精品国产久精国产果冻传媒| 秋霞鲁丝片Av无码| 在线观看精品视频看看播放| seba51久久精品| 青青草原影视| 国产99久久九九精品无码不卡| 天天射天天爱天天干| 扒开女生尿口| 网红主播 国产精品 开放90后| 99国产精品综合AV无码| 奇米色偷偷| 国产成人欧美日韩在线电影 | 黑人巨大交牲老太| 一区二区三区国产亚洲网站| 国产毛多水多高潮高清| 日本美女阴道| qvod 电影| 午夜伦伦电影理论片费看| 成人天堂婷婷青青视频在线观看| 甜性涩爱免费下载|