天天看點

002 Rust異步程式設計,async await簡單介紹

此節對async/await做簡單介紹,旨在讓大家有一個簡單的認識。

作用

async/.await是Rust編寫異步的内置工具。async将一個代碼塊轉化為實作了future特征的狀态機。

那麼,轉化為future後有什麼作用呢?答案:在同步方法中調用阻塞函數(async轉化的函數)會阻塞整個線程,但是,阻塞的future會讓出線程控制權,允許其它future運作。

部分文法

  • 準備工作:配置檔案Cargo.toml
[dependencies]
futures = "0.3.4"      
  • 建立異步函數

建立異步函數的文法:

async fn my_function() {
    println!("Hello");
}      

通過async關鍵字,上面的函數傳回一個Future。換句話說,上面的函數等價于如下代碼:

fn my_function() -> impl Future<Output = ()> {
    async {
        println!("Hello");
    }
}      
  • 調用異步函數

上面簡介紹了建立異步函數的文法,下面我們看下如何調用異步函數。

(1)通過block_on阻塞調用

//例子一
use futures::executor;

async fn my_function() {
    println!("Hello");
}

fn main() {
    let f = my_function();
    executor::block_on(f);
}      

(2)通過.await調用

//例子二
use futures::{ self, executor};

async fn learn_song() {
    println!("Learn song!");
}

async fn sing_song() {
    println!("Sing song!");
}

async fn dance() {
    println!("Dance!");
}

async fn learn_and_sing_song() {
    learn_song().await;
    sing_song().await;
}

async fn async_main() {
    let f1 = learn_and_sing_song();
    let f2 = dance();
    futures::join!(f1, f2);
}
fn main() {
    executor::block_on(async_main());
    println!("Hello, world!");
}      

說明:

a、在learn_and_sing_song()中,會先執行learn_song(),然後再執行sing_song(),兩者按照順序執行;

b、通過join,能等待多個Future完成;

c、當await發生阻塞時,不會阻塞目前線程,可以讓其它的任務執行(在此例子中,如果在learn_song阻塞,則learn_and_sing_song會讓出目前線程,可以讓dance執行)。

總結

本節主要簡單介紹async/await在異步函數方面的用法,同時通過sing、song、dance的例子,展示了async的應用。

繼續閱讀