那曲檬骨新材料有限公司

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大家赢娱乐| 百家乐官网娱乐网网| 百家乐官网线上代理网站| 威尼斯人娱乐平台博彩投注平| 伯爵百家乐娱乐城| 网上娱乐城注册送彩金| 百家乐信息| 24山分房法| 百家乐官网的路子怎么| 渑池县| 百家乐园蒙特卡罗| 大佬百家乐官网娱乐城| 百家乐官网哪条路好| 大发888娱乐城技巧| 百家乐官网网络游戏平台| 中信娱乐城| 大发888游戏平台 46| 百家乐官网概率怎么算| 大发888怎么能不卡| 手机百家乐的玩法技巧和规则 | 网上百家乐| 大发888官| 大发888娱乐城优惠码| 金博士百家乐的玩法技巧和规则| 百家乐官网网页qq| 百家乐官网太阳城 | 百家乐官网游戏客户端| 解析百家乐官网投注法| 最新皇冠网址| 六合彩挂牌| 大发888登陆网页游戏| 新全讯网321| 环球百家乐娱乐城| 百家乐庄闲和赢率| 太阳城百家乐娱乐官方网| 百家乐合理的投注法| 24山向山摆设| 赌百家乐大小点桌|