Rust 異步編程,async await


 

 應用:簡單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 異步編程的學習筆記。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM