那曲檬骨新材料有限公司

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

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

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

文盤(pán)Rust -- 用Tokio實(shí)現(xiàn)簡(jiǎn)易任務(wù)池

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

Tokio 無(wú)疑是 Rust 世界中最優(yōu)秀的異步Runtime實(shí)現(xiàn)。非阻塞的特性帶來(lái)了優(yōu)異的性能,但是在實(shí)際的開(kāi)發(fā)中我們往往需要在某些情況下阻塞任務(wù)來(lái)實(shí)現(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));


                });


            }


        });


    }
我們期待的運(yùn)行結(jié)構(gòu)是通過(guò)異步任務(wù)打印出99個(gè) “spawn i",但實(shí)際輸出的結(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í)行完后面就沒(méi)有輸出了,如果把max_task設(shè)置為2,情況會(huì)好一點(diǎn),但是也沒(méi)有執(zhí)行完所有的異步操作,也就是說(shuō)在資源不足的情況下,Tokio會(huì)拋棄某些任務(wù),這不符合我們的預(yù)期。那么能不能再達(dá)到了某一閥值的情況下阻塞一下,不再給Tokio新的任務(wù)呢。這有點(diǎn)類(lèi)似線程池,當(dāng)達(dá)達(dá)最大線程數(shù)的時(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來(lái)管理派生出來(lái)的任務(wù)。set.join_next().await; 保證至少一個(gè)任務(wù)被執(zhí)行完成。結(jié)合set的len,我們可以在任務(wù)達(dá)到上限時(shí)阻塞任務(wù)派生。當(dāng)循環(huán)結(jié)束,可能還有未完成的任務(wù),所以只要set.len()大于0就等待任務(wù)結(jié)束。

輸出大概長(zhǎng)這樣

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é)可以動(dòng)手嘗試一下。

審核編輯 :李倩


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

    關(guān)注

    0

    文章

    57

    瀏覽量

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

    關(guān)注

    0

    文章

    13

    瀏覽量

    2194
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    230

    瀏覽量

    6665
  • Tokio
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    70

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是Tokio模塊 Channel?

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

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

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

    使用tokio實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Client和Server通訊模型

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

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

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

    WasmEdge增加了Tokio支持

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

    盤(pán)Rust--r2d2實(shí)現(xiàn)redis連接

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

    盤(pán)Rust -- rust連接oss

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

    盤(pán)Rust -- tokio綁定cpu實(shí)踐

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

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

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

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

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

    如何使用 Tokio 模塊的Channel

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

    tokio模塊channel中的使用場(chǎng)景和優(yōu)缺點(diǎn)

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

    Tokio 的基本用法

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

    Channel模塊的使用方法示例

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

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

    本項(xiàng)目實(shí)現(xiàn)了一個(gè)高并發(fā)內(nèi)存,參考了Google的開(kāi)源項(xiàng)目tcmalloc實(shí)現(xiàn)簡(jiǎn)易版;其功能就是實(shí)現(xiàn)高效的多線程內(nèi)存管理。由功能可知,高并
    的頭像 發(fā)表于 11-09 11:16 ?773次閱讀
    高并發(fā)內(nèi)存<b class='flag-5'>池</b>項(xiàng)目<b class='flag-5'>實(shí)現(xiàn)</b>
    大发888娱乐在线客服| 大发888下载亚洲城| 玩百家乐游戏的最高技巧| 百家乐官网德州扑克发牌盒| 百家乐官网庄闲点| 百家乐官网技巧娱乐博彩| 澳门博彩在线| 大发888充值500| 网上百家乐娱乐场开户注册| 百家乐怎么赢9| 太阳城百家乐官网怎么出千| 台北市| 赌球赔率| 大发888娱乐场图标| 百家乐扑克牌手机壳| 土豪百家乐的玩法技巧和规则 | 太阳城蓝山园| 百家乐赌场代理| 手机百家乐官网游戏| 澳门百家乐官网单注下注| 百家乐官网视频游戏世界| 深泽县| 百家乐群shozo权威| 百家乐平台那家好| 百家乐下注技术| 澳门百家乐秘诀| 乐天百家乐官网的玩法技巧和规则| 百家乐官网保单机作弊| 百家乐官网大小点桌子| 百家乐官网软件骗人吗| 固阳县| 金沙百家乐官网现金网| 五张百家乐的玩法技巧和规则 | 蓝盾百家乐官网庄家利润分| 赌百家乐官网庄闲能赢| 百家乐官网庄闲和的概率| 百家乐官网真人游戏娱乐场| 下载百家乐官网棋牌大厅| 百家乐官网2号技术打法| 百家乐官网足球投注网哪个平台网址测速最好 | 大发888账号注册|