衡阳派盒市场营销有限公司

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娱乐城下载英皇国际| 百家乐怎么下注能赢| 百家乐官网玩揽法大全| 百家乐官网3带厂家地址| 新葡京娱乐| 大发888大发888官网| 利博百家乐破解| 百家乐玩法秘诀| 百家乐官网五湖四海娱乐| 百家乐官网论坛在线提供| 织金县| 皇家娱乐城| 澳门顶级赌场娱乐平台| 百家乐赢钱面面观| 百家乐翻天粤qvod| 百家乐客户端LV| 百家乐哪条路好| 百家乐官网平注常赢玩法| 凯斯百家乐的玩法技巧和规则| 太阳城百家乐168| 利记百家乐现金网| 24山先天分房| 真人百家乐口诀| 百家乐官网园首选| 高楼24层风水好吗| 百家乐官网论坛| 百家乐官网筹码托盘| 休闲百家乐官网的玩法技巧和规则| 百家乐官网说明| 金龍百家乐官网的玩法技巧和规则 | 百家乐任你博赌场娱乐网规则|