0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

文盤Rust -- 用Tokio實現(xiàn)簡易任務(wù)池

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

Tokio 無疑是 Rust 世界中最優(yōu)秀的異步Runtime實現(xiàn)。非阻塞的特性帶來了優(yōu)異的性能,但是在實際的開發(fā)中我們往往需要在某些情況下阻塞任務(wù)來實現(xiàn)某些功能。

我們看看下面的例子

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));


                });


            }


        });


    }
我們期待的運行結(jié)構(gòu)是通過異步任務(wù)打印出99個 “spawn i",但實際輸出的結(jié)果大概這樣
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執(zhí)行完后面就沒有輸出了,如果把max_task設(shè)置為2,情況會好一點,但是也沒有執(zhí)行完所有的異步操作,也就是說在資源不足的情況下,Tokio會拋棄某些任務(wù),這不符合我們的預(yù)期。那么能不能再達(dá)到了某一閥值的情況下阻塞一下,不再給Tokio新的任務(wù)呢。這有點類似線程池,當(dāng)達(dá)達(dá)最大線程數(shù)的時候阻塞后面的任務(wù)待有釋放的線程后再繼續(xù)。

我們看看下面的代碼。

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來管理派生出來的任務(wù)。set.join_next().await; 保證至少一個任務(wù)被執(zhí)行完成。結(jié)合set的len,我們可以在任務(wù)達(dá)到上限時阻塞任務(wù)派生。當(dāng)循環(huán)結(jié)束,可能還有未完成的任務(wù),所以只要set.len()大于0就等待任務(wù)結(jié)束。

輸出大概長這樣

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
符合預(yù)期,代碼不多,有興趣的同學(xué)可以動手嘗試一下。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 線程池
    +關(guān)注

    關(guān)注

    0

    文章

    56

    瀏覽量

    6828
  • 非阻塞
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    2164
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    228

    瀏覽量

    6542
  • Tokio
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    50

原文標(biāo)題:文盤Rust -- 用Tokio實現(xiàn)簡易任務(wù)池

文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    什么是Tokio模塊 Channel?

    Rust 語言是一種系統(tǒng)級編程語言,它具有強(qiáng)類型和內(nèi)存安全性。Rust 語言中的 Tokio 模塊是一個異步編程庫,它提供了一種高效的方式來處理異步任務(wù)。其中,channel 是
    的頭像 發(fā)表于 09-19 15:57 ?903次閱讀

    線程是如何實現(xiàn)

    線程的概念是什么?線程是如何實現(xiàn)的?
    發(fā)表于 02-28 06:20

    使用tokio實現(xiàn)一個簡單的Client和Server通訊模型

    本系列是關(guān)于Rust構(gòu)建一個KV Server的系列文章,內(nèi)容包括tokio做底層異步網(wǎng)絡(luò)通訊、使用toml文件做配置、protobuf做傳輸協(xié)議、內(nèi)存/RockDB做數(shù)據(jù)存儲、事
    的頭像 發(fā)表于 09-09 09:45 ?2215次閱讀

    如何用Rust構(gòu)建一個KV Server系列

    本系列是關(guān)于Rust構(gòu)建一個KV Server的系列文章,內(nèi)容包括tokio做底層異步網(wǎng)絡(luò)通訊、使用toml文件做配置、protobuf做傳輸協(xié)議、內(nèi)存/RockDB做數(shù)據(jù)存儲、事
    的頭像 發(fā)表于 09-14 10:03 ?1299次閱讀

    WasmEdge增加了Tokio支持

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

    Rust--r2d2實現(xiàn)redis連接

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

    Rust -- rust連接oss

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

    Rust -- tokio綁定cpu實踐

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

    Tokio 模塊的優(yōu)雅停機(jī)機(jī)制

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

    如何使用Tokio 和 Tracing模塊構(gòu)建異步的網(wǎng)絡(luò)應(yīng)用程序

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

    如何使用 Tokio 模塊的Channel

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

    tokio模塊channel中的使用場景和優(yōu)缺點

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

    Tokio 的基本用法

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

    Channel模塊的使用方法示例

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

    高并發(fā)內(nèi)存項目實現(xiàn)

    本項目實現(xiàn)了一個高并發(fā)內(nèi)存,參考了Google的開源項目tcmalloc實現(xiàn)簡易版;其功能就是實現(xiàn)高效的多線程內(nèi)存管理。由功能可知,高并
    的頭像 發(fā)表于 11-09 11:16 ?659次閱讀
    高并發(fā)內(nèi)存<b class='flag-5'>池</b>項目<b class='flag-5'>實現(xiàn)</b>