色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美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>
    主站蜘蛛池模板: 女朋友的妈妈在线观看| 国产亚洲欧美日韩综合综合二区| 色婷婷欧美在线播放内射| 久久精品国产午夜伦班片| 囯产精品一品二区三区| www.中文字幕在线观看| 97碰成视频免费| 最新影音先锋av资源台| 一级毛片在线免费视频| 亚洲精品入口一区二区乱麻豆精品| 少妇被躁爽到高潮无码久久| 女人和男人插曲视频大全| 毛篇片在线观看| 久久久青青| 久久久乱码精品亚洲日韩| 九九热这里只有精品2| 国内精自品线一区91| 国产在线高清视频无码| 国产精品成久久久久三级四虎| 国产成人在线视频播放| 国产精品亚洲专区在线播放| 囯产精品一品二区三区| 国产成人综合在线观看| 国产精品99久久久久久AV| 国产精品自在自线亚洲| 男女又黄又刺激B片免费网站| 久久精品综合网中文字幕| 久久精品麻豆国产天美传媒果冻| 久久强奷乱码老熟女| 麻豆COMCN| 男总裁憋尿PLAY灌尿BL| 免费撕开胸罩吮胸视频| 年轻的女教师2017韩国在线看 | 破苞流血哭泣 magnet| 年轻的朋友4在线看中文字幕| 快播看av| 伊人色综合久久天天网| 久久笫一福利免费导航| 成人欧美尽粗二区三区AV| 亚洲国产欧美在线看片| 美女扒开屁股让男人桶|