Rustの非同期処理
参考
2019/11
長過ぎるが、良い
割と変遷があったっぽく、最新の状況を理解するための良い資料がどれなのかわからない

書籍や記事を参考にする際も、いちいち書かれた日を注意して読まないといけない
Futureの糖衣構文
非同期操作を表す抽象型
Rustの非同期システムの中心
非同期処理を実行するためのエンジン
特定のユースケース向けのライブラリ
上記の何らかのruntime上で動作する
>tokio は 3rd party のライブラリです。そこで JS などを経験した人は、「どうして非同期処理が 3rd party library なの?」と思うかもしれません。
> Rust(std) そのものには非同期処理の仕組み自体はあります。 しかし非同期のタスク群をスケジューリングして実行する仕組みがありません。 これはユーザーもしくはライブラリに任されています。 tokio が提供しているのはそのための schedular や executor です。
>Rustの非同期プログラミングはあらゆるプラットフォームで動くように設計されています。 一般的によく使われるWebサーバーやGUIアプリケーションはもちろん、 WebAssemblyでも薄いランタイムライブラリだけで動くようになっていますし、 果ては組み込み(ベアメタル)環境でも動くようになっているのです。
>ここまでで非同期関数や非同期ブロックで非同期タスクを作る方法を紹介しましたが、このままではタスクを実行することは出来ません。
> 例えば下記のコードを実行しても、表示されるのは一番下の"piyo"のみです。
rsasync fn hoge() {
println!("hoge");
}
fn main() {
let _ = hoge();
let _ = async {
println!("fuga");
};
println!("piyo");
}
monadをrunするみたいな感じか

await するか、適切なランタイムで実行する必要がある
tokioで複数の非同期タスクを並列実行する様子
rsuse tokio::time::{sleep, Duration};
async fn task1() {
sleep(Duration::from_secs(2)).await;
println!("Task 1 done!");
}
async fn task2() {
sleep(Duration::from_secs(1)).await;
println!("Task 2 done!");
}
#[tokio::main]
async fn main() {
let t1 = task1();
let t2 = task2();
tokio::join!(t1, t2); // 2つのタスクを並列実行
}
tokio::join!
複数の非同期タスクを並列実行し、すべてのタスクが終了するのを待つ
task1 は 2 秒後に完了、task2 は 1 秒後に完了するので、実行順は Task 2 done! → Task 1 done! になる
Pin