此節對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 協議》,轉載必須註明作者和本文連結