プリエンティブマルチタスク: 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する意味が何となくわかった。