chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

文盤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)類似線程池,當(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)容及配圖由入駐作者撰寫或者入駐合作網(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

    瀏覽量

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

    關(guān)注

    0

    文章

    13

    瀏覽量

    2344
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    240

    瀏覽量

    7464
  • Tokio
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    230

原文標(biāo)題:文盤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)推薦
    熱點(diǎn)推薦

    SQLx在Rust語(yǔ)言中的基礎(chǔ)用法和進(jìn)階用法

    SQLx是一個(gè)Rust語(yǔ)言的異步SQL執(zhí)行庫(kù),它支持多種數(shù)據(jù)庫(kù),包括MySQL、PostgreSQL、SQLite等。本教程將以MySQL數(shù)據(jù)庫(kù)為例,介紹SQLx在Rust語(yǔ)言中的基礎(chǔ)用法和進(jìn)階用法
    的頭像 發(fā)表于 09-19 14:32 ?6953次閱讀

    什么是Tokio模塊 Channel?

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

    使用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 ?2933次閱讀

    如何用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 ?1758次閱讀

    WasmEdge增加了Tokio支持

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

    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 ?1390次閱讀

    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 ?1090次閱讀

    Rust -- tokio綁定cpu實(shí)踐

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

    如何使用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 ?1389次閱讀

    如何使用 Tokio 模塊的Channel

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

    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 ?1687次閱讀

    Tokio 的基本用法

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

    Channel模塊的使用方法示例

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

    高并發(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 ?1290次閱讀
    高并發(fā)內(nèi)存<b class='flag-5'>池</b>項(xiàng)目<b class='flag-5'>實(shí)現(xiàn)</b>