【Rust】非同期処理 Async, awaitを整理する

プリエンティブマルチタスク: OSにより実行を制御する
協調的マルチタスク: コンテキストの切り替え、スレッドの置き換えはできる
コールチン: 協調的マルチタスクを制御できる
Futureオブジェクト: 処理が終わったらコールバック、awaitは実行完了まで待つ

use std::{thread, time};
#[tokio::main]
async fn main(){

    let handle = tokio::spawn(async {
        thread::sleep(time::Duration::from_millis(1000));
        println!("1 sec elapsed");
    });
    
    let order = "beef burger".to_string();
    order_burger(order).await;
    play_game().await;
}

async fn order_burger(order: String) -> Result<String, Box<dyn std::error::Error>> {
    match order {
        ref val if *val == "beef burger".to_string() => thread::sleep(time::Duration::from_millis(200)),
        ref val if *val == "cake".to_string()  => thread::sleep(time::Duration::from_millis(300)),
        _ => println!("Please order!"),
    }
    println!("Order received {}", order);
    Ok(order)
}

async fn play_game() {
    println!("I am playing game");
}

Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.60s
Running `target/debug/app`
Order received beef burger
I am playing game
1 sec elapsed

asyncの関数をawaitで実行した場合は、その次の関数は実行完了まで実行されない。
別のスレッドを立てた場合は、並列で処理がされる。

なるほど、async処理をawaitする意味が何となくわかった。