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

linghuyichong發表於2020-05-28

此節對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的應用。

但是,本例子中只是簡單的語法展示,並不能真正達到我們想要的非同步效果。

那麼,為什麼無法達到我們想要的效果,請持續關注我們Rust非同步程式設計的學習筆記。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章