日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Rust Tokio取消任務的幾種模式,你知道嗎?

來源: 責編: 時間:2024-05-20 17:53:30 214觀看
導讀Rust提供了對異步編程的支持,它可以生成異步任務,然后通過運行時執行器在操作系統線程之間調度執行。與Rust中的所有東西一樣,異步編程必須是內存安全的,因此需要確保借用檢查器可以編譯通過。這篇文章是關于任務取消模式

Rust提供了對異步編程的支持,它可以生成異步任務,然后通過運行時執行器在操作系統線程之間調度執行。h2G28資訊網——每日最新資訊28at.com

與Rust中的所有東西一樣,異步編程必須是內存安全的,因此需要確保借用檢查器可以編譯通過。h2G28資訊網——每日最新資訊28at.com

這篇文章是關于任務取消模式的,下面我們來介紹Tokio任務的取消模式。h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

Select 和 Channels

所有這些模式的核心是兩個tokio特性:h2G28資訊網——每日最新資訊28at.com

  • channel:用于任務間通信
  • select:用于等待多個異步計算(不一定是任務!)

Tokio channel看起來有點復雜,但同時就程序的內存安全和彈性而言,它很強大。Tokio channel創建了兩個不同的對象,用于任務之間的通信,不能同時使用一個通道對象來接收和發送。h2G28資訊網——每日最新資訊28at.com

Tokio提供的頻道實際上有四種:h2G28資訊網——每日最新資訊28at.com

  • mpsc:多個生產者,單一消費者
  • oneshot:用于發送和接收單個值,發送后,通道關閉。
  • broadcast:多個發送者,多個消費者
  • watch:單一生產者,多個消費者

h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

Drop JoinHandle不會取消任務

JoinHandle在刪除關聯的任務時將其分離,這意味著不再有任何任務句柄,也沒有辦法對其進行連接。h2G28資訊網——每日最新資訊28at.com

每次在tokio中生成任務時,都會返回JoinHandle。可以使用join句柄來等待任務完成,但是認為可以使用它來簡單地通過刪除任務來強制終止任務是錯誤的。這里有一個愚蠢的例子:h2G28資訊網——每日最新資訊28at.com

use tokio::time::{self, Duration};#[tokio::main]async fn main() {    let handle = tokio::spawn(async {        // do some work        tokio::time::sleep(Duration::from_secs(10)).await;        println!("Task completed");    });    // 100毫秒后取消任務    time::sleep(Duration::from_millis(100)).await;    drop(handle);    println!("Task was cancelled");}

h2G28資訊網——每日最新資訊28at.com

丟棄句柄并不會取消正在運行的任務!h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

Abort任務

這是取消任務的最極端的方式,沒有清理的空間:h2G28資訊網——每日最新資訊28at.com

use tokio::time::{self, Duration};#[tokio::main]async fn main() {    let handle = tokio::spawn(async {        // do some work        tokio::time::sleep(Duration::from_secs(1)).await;        println!("Task completed");    });    // 100毫秒后取消任務    time::sleep(Duration::from_millis(100)).await;    handle.abort();    time::sleep(Duration::from_secs(2)).await;    println!("Task was cancelled");}

h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

使用oneshot channel

oneshot channel允許通道上的發送單個值,可以由多個接收器偵聽。與drop模式不同,此模式允許通道執行一些清理工作。這里有一個例子:h2G28資訊網——每日最新資訊28at.com

use tokio::sync::oneshot;use tokio::time::Duration;#[tokio::main]async fn main() {    let (tx, rx) = oneshot::channel();    let task = tokio::spawn(async move {        tokio::select! {            _ = rx => {                println!("Task is cancelling...");            }            _ = tokio::time::sleep(Duration::from_secs(10)) => {                println!("Task completed normally");            }        }        println!("Task is cleaning up");    });    tokio::time::sleep(Duration::from_millis(100)).await;    // 發送取消信號    let _ = tx.send(());    // 等待任務完成    let _ = task.await;}

h2G28資訊網——每日最新資訊28at.com

運行結果如下:h2G28資訊網——每日最新資訊28at.com

Task is cancelling...Task is cleaning up

h2G28資訊網——每日最新資訊28at.com

oneshot channel的限制是你不能用它來取消多個任務。h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

使用broadcast channel取消多個任務

如果要取消多個任務,可以使用broad channel。可以有多個生產者向通道發送信息,也可以有多個消費者從通道接收信息。每個接收方都可以看到在通道上發送的每個值。h2G28資訊網——每日最新資訊28at.com

這里有一個簡單的例子,來演示如何使用它來取消多個任務:h2G28資訊網——每日最新資訊28at.com

use tokio::sync::broadcast;use tokio::time::Duration;#[tokio::main]async fn main() {    let (tx, mut rx1) = broadcast::channel(1);    let mut rx2 = tx.subscribe();    let task1 = tokio::spawn(async move {        tokio::select! {            _ = rx1.recv() => {                println!("Task 1 is cancelling...");            }            _ = tokio::time::sleep(Duration::from_secs(10)) => {                println!("Task 1 completed normally");            }        }        println!("Task 1 is cleaning up");    });    let task2 = tokio::spawn(async move {        tokio::select! {            _ = rx2.recv() => {                println!("Task 2 is cancelling...");            }            _ = tokio::time::sleep(Duration::from_secs(10)) => {                println!("Task 2 completed normally");            }        }        println!("Task 2 is cleaning up");    });    tokio::time::sleep(Duration::from_millis(100)).await;    // 發送取消信號    let _ = tx.send(());    // 等待任務完成    let _ = tokio::join!(task1, task2);}

h2G28資訊網——每日最新資訊28at.com

運行結果如下:h2G28資訊網——每日最新資訊28at.com

Task 2 is cancelling...Task 2 is cleaning upTask 1 is cancelling...Task 1 is cleaning up

取消的順序可能會有所不同,因為任務可能會以不同的順序取消!h2G28資訊網——每日最新資訊28at.com

如果只想從單個任務向多個任務發送取消信號,那么broad channel可能有點過度,因為它提供了在多個任務之間傳遞消息的所有機制。h2G28資訊網——每日最新資訊28at.com

如果既需要消息傳遞又需要消息取消,這很方便。但如果只需要消息取消,還有更好的方法,開銷更少:watch channel。h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

使用watch channel取消多個任務

watch channel是多個消費者頻道的單一生產者。watch channel給了任務清理自己的機會。缺點是,消費者只能看到通道上發送的最近的值——這意味著如果任務在通道上發送了一個值之后啟動,它可能會錯過它,因此不會被取消,所以要小心這一點。這里有一個簡單的例子:h2G28資訊網——每日最新資訊28at.com

use tokio::sync::watch;use tokio::time::Duration;#[tokio::main]async fn main() {    let (tx, mut rx1) = watch::channel(false);    let mut rx2 = tx.subscribe();    let task1 = tokio::spawn(async move {        loop {            tokio::select! {                _ = rx1.changed() => {                    if *rx1.borrow() {                        println!("Task 1 is cancelling...");                        break;                    }                }                _ = tokio::time::sleep(Duration::from_secs(10)) => {                    println!("Task 1 completed normally");                    break;                }            }        }        println!("Task 1 is cleaning up");    });    let task2 = tokio::spawn(async move {        loop {            tokio::select! {                _ = rx2.changed() => {                    if *rx2.borrow() {                        println!("Task 2 is cancelling...");                        break;                    }                }                _ = tokio::time::sleep(Duration::from_secs(10)) => {                    println!("Task 2 completed normally");                    break;                }            }        }        println!("Task 2 is cleaning up");    });    tokio::time::sleep(Duration::from_millis(100)).await;    // 發送取消信號    let _ = tx.send(true);    // 等待任務完成    let _ = tokio::join!(task1, task2);}

h2G28資訊網——每日最新資訊28at.com

h2G28資訊網——每日最新資訊28at.com

取消令牌

官方的Tokio文檔中列出了一種名為CancellationToken的東西,用于優雅關機。這在tokio crate本身中不可用,但在相關的toko_util crate中可用。h2G28資訊網——每日最新資訊28at.com

use tokio::time::{sleep, Duration};use tokio_util::sync::CancellationToken;#[tokio::main]async fn main() {    // Create a CancellationToken    let token = CancellationToken::new();    let token1 = token.clone();    let token2 = token.clone();    let task1 = tokio::spawn(async move {        loop {            tokio::select! {                _ = token1.cancelled() => {                        println!("Task 1 is cancelling...");                        break;                }                _ = tokio::time::sleep(Duration::from_secs(10)) => {                    println!("Task 1 completed normally");                    break;                }            }        }        println!("Task 1 is cleaning up");    });    let task2 = tokio::spawn(async move {        loop {            tokio::select! {                _ = token2.cancelled() => {                        println!("Task 2 is cancelling...");                        break;                }                _ = tokio::time::sleep(Duration::from_secs(10)) => {                    println!("Task 2 completed normally");                    break;                }            }        }        println!("Task 2 is cleaning up");    });    sleep(Duration::from_millis(100)).await;    // 發送取消信號    token.cancel();    // 等待任務完成    let _ = tokio::join!(task1, task2);}

請注意我們是如何克隆令牌的,以便將其移動到各個異步任務中。h2G28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-89399-0.htmlRust Tokio取消任務的幾種模式,你知道嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 基于Jenkins Pipeline構建企業級CI/CD

下一篇: 小米面試:如何實現優先級線程池?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲午夜成aⅴ人片| 亚洲第一狼人社区| 国产精品久久婷婷六月丁香| 国产精品爽黄69| 国产综合婷婷| 亚洲精选91| 欧美一区二区三区视频| 欧美h视频在线| 国产精品多人| 激情综合色综合久久| 日韩视频在线永久播放| 欧美一区二区三区久久精品| 美女黄色成人网| 国产精品乱码| 亚洲级视频在线观看免费1级| 亚洲免费在线观看视频| 两个人的视频www国产精品| 欧美日韩精选| 黄色成人小视频| 亚洲午夜电影在线观看| 久久综合九色综合网站 | 国产精品毛片a∨一区二区三区|国| 国产一区高清视频| 一区二区三欧美| 玖玖玖国产精品| 国产欧美69| 在线亚洲一区观看| 免费精品视频| 国产一区二区三区四区三区四| 久久久综合网| 国产精品久久国产精品99gif| 亚洲电影欧美电影有声小说| 欧美一乱一性一交一视频| 欧美日韩精品在线视频| 亚洲电影天堂av| 久久av一区| 国产精品免费一区豆花| 亚洲九九九在线观看| 久久久综合网站| 国产亚洲aⅴaaaaaa毛片| 在线视频你懂得一区| 美日韩精品视频| 国产在线精品二区| 亚洲自拍偷拍色片视频| 欧美精品色综合| 亚洲风情亚aⅴ在线发布| 欧美一区二区三区免费观看| 国产精品黄色在线观看| 日韩亚洲在线| 欧美高清视频一区| 亚洲第一精品夜夜躁人人躁 | 麻豆av福利av久久av| 国产午夜一区二区三区| 亚洲一区日韩在线| 欧美日韩国产探花| 亚洲人久久久| 牛人盗摄一区二区三区视频| 黄色影院成人| 久久久www成人免费毛片麻豆| 国产女主播视频一区二区| 亚洲影视在线播放| 欧美视频手机在线| 99视频精品在线| 欧美精品国产一区| 亚洲肉体裸体xxxx137| 免费在线播放第一区高清av| 在线观看亚洲精品| 老牛国产精品一区的观看方式| 韩国免费一区| 久久久夜夜夜| 在线观看免费视频综合| 久久字幕精品一区| 亚洲福利视频在线| 欧美成人精品| 玖玖玖免费嫩草在线影院一区| 欧美午夜片在线观看| 一色屋精品视频在线看| 欧美一区二区视频在线观看| 国产精品香蕉在线观看| 亚洲欧美日韩第一区| 欧美视频在线观看一区| 中文有码久久| 欧美性猛交视频| 亚洲在线成人精品| 欧美午夜片在线免费观看| 亚洲少妇在线| 国产精品实拍| 欧美一区二区在线| 国产亚洲一区二区三区在线观看 | 欧美中文字幕视频| 国产有码一区二区| 久久综合导航| 国产亚洲精品激情久久| 一本久道久久综合中文字幕| 免费成人黄色片| 亚洲国产女人aaa毛片在线| 麻豆国产精品va在线观看不卡| 影音先锋久久久| 欧美大片免费久久精品三p | 红桃视频欧美| 美女在线一区二区| 亚洲精选中文字幕| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 在线一区观看| 国产女人18毛片水18精品| 久久成人18免费观看| 在线看国产一区| 欧美破处大片在线视频| 亚洲淫片在线视频| 激情综合网激情| 在线观看福利一区| 免费av成人在线| 一本色道精品久久一区二区三区 | 亚洲视频在线一区| 新狼窝色av性久久久久久| 国产一区二区三区四区五区美女| 久久免费视频在线观看| 亚洲福利视频一区| 欧美日韩免费区域视频在线观看| 亚洲欧美另类在线观看| 黄色av日韩| 欧美激情一二三区| 亚洲一区三区在线观看| 国模一区二区三区| 欧美精品久久久久久久久老牛影院| 亚洲一区二区三区在线| 韩国av一区二区三区四区| 农夫在线精品视频免费观看| 亚洲午夜在线| 伊人婷婷欧美激情| 欧美视频在线观看一区| 久久久人成影片一区二区三区| 日韩视频在线观看免费| 国产三级欧美三级| 欧美日本久久| 久久九九全国免费精品观看| 99精品热6080yy久久| 国产亚洲a∨片在线观看| 欧美激情一区二区三区成人| 午夜一区二区三区不卡视频| 亚洲欧洲精品一区二区精品久久久 | 99riav久久精品riav| 国产午夜精品一区二区三区欧美 | 亚洲第一色在线| 国产精品日韩在线| 欧美黑人在线播放| 欧美一区二区三区的| 亚洲美女av黄| 精品成人免费| 国产精品久久网站| 欧美精品久久99| 久久综合给合| 午夜精品在线视频| 9国产精品视频| 亚洲激情成人在线| 国产字幕视频一区二区| 欧美午夜美女看片| 欧美激情性爽国产精品17p| 欧美在线一级va免费观看| 亚洲天堂av在线免费| 亚洲人精品午夜| 伊人久久av导航| 国产日韩视频一区二区三区| 欧美日韩在线第一页| 欧美大片一区| 久久一区激情| 久久av一区| 午夜一区二区三区在线观看| 亚洲无线一线二线三线区别av| 亚洲人成在线播放网站岛国| 在线成人欧美| 精品粉嫩aⅴ一区二区三区四区| 国产欧美一区二区三区视频| 欧美日韩直播| 欧美另类综合| 欧美凹凸一区二区三区视频| 久久人人爽人人爽爽久久| 久久国产天堂福利天堂| 亚洲欧美怡红院| 亚洲尤物精选| 亚洲一区在线播放| 亚洲视频免费在线| av不卡在线看| 一本色道久久综合亚洲二区三区| 亚洲人成毛片在线播放| 亚洲电影中文字幕| 亚洲高清一二三区| 亚洲第一在线视频| 亚洲第一精品久久忘忧草社区| 一区二区三区在线视频观看| 黄色成人精品网站| 激情亚洲一区二区三区四区| 国内久久精品视频| 狠狠色综合网站久久久久久久| 国产亚洲一区在线| 国产亚洲精品v| 国模精品一区二区三区| 国产综合久久| 影音先锋亚洲一区| 一区二区亚洲精品国产| 在线观看日韩av先锋影音电影院| 在线电影国产精品| 亚洲日本成人网| 日韩视频一区二区三区在线播放免费观看|