應用:簡單HTTP服務器
https://learnku.com/docs/async-book/2018/http_server_example/4789
//例子二 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!"); }
簡寫!這里需要注意的是println!非println,多了感嘆號!,后綴不帶感嘆號為普通函數,帶感嘆號的為宏函數,rust不存在println普通函數。
宏的參數可以用方括號包圍
C語言帶參數的宏,其參數使用圓括號包圍。Rust也可以使用圓括號包圍參數,但是Rust的宏還可以用方括號包圍,如:
let v = vec![1, 2, 3, 4, 5];
root@bogon async2]# cargo build Compiling own v0.1.0 (/data2/rust/async2) Finished dev [unoptimized + debuginfo] target(s) in 0.62s [root@bogon async2]# cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.03s Running `target/debug/own` Learn song! Sing song! Dance! Hello, world! [root@bogon async2]# cargo run Finished dev [unoptimized + debuginfo] target(s) in 0.03s Running `target/debug/own` Learn song! Sing song! Dance! Hello, world! [root@bogon async2]#
作用
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 異步編程的學習筆記。
