Rustの非同期処理
参考
Rustの非同期プログラミングをマスターする - OPTiM TECH BLOG
2019/11
長過ぎるが、良い
#wip
割と変遷があったっぽく、最新の状況を理解するための良い資料がどれなのかわからないmrsekut.icon
書籍や記事を参考にする際も、いちいち書かれた日を注意して読まないといけない
async/await (rs)
Futureの糖衣構文
Rust v1.39で入った
Future trait
非同期操作を表す抽象型
Rustの非同期システムの中心
RustのAsync Runtime
非同期処理を実行するためのエンジン
特定のユースケース向けのライブラリ
e.g. reqwest
上記の何らかのruntime上で動作する
https://hack.nikkei.com/blog/advent20221213/
tokio は 3rd party のライブラリです。そこで JS などを経験した人は、「どうして非同期処理が 3rd party library なの?」と思うかもしれません。
Rust(std) そのものには非同期処理の仕組み自体はあります。 しかし非同期のタスク群をスケジューリングして実行する仕組みがありません。 これはユーザーもしくはライブラリに任されています。 tokio が提供しているのはそのための schedular や executor です。
https://tech-blog.optim.co.jp/entry/2019/11/08/163000
Rustの非同期プログラミングはあらゆるプラットフォームで動くように設計されています。 一般的によく使われるWebサーバーやGUIアプリケーションはもちろん、 WebAssemblyでも薄いランタイムライブラリだけで動くようになっていますし、 果ては組み込み(ベアメタル)環境でも動くようになっているのです。
Futureの実行には非同期ランタイムが必要
RustのAsync Runtime
https://tech-blog.optim.co.jp/entry/2019/11/08/163000#ランタイムで非同期タスクを起動する
ここまでで非同期関数や非同期ブロックで非同期タスクを作る方法を紹介しましたが、このままではタスクを実行することは出来ません。
例えば下記のコードを実行しても、表示されるのは一番下の"piyo"のみです。
code:rs
async fn hoge() {
println!("hoge");
}
fn main() {
let _ = hoge();
let _ = async {
println!("fuga");
};
println!("piyo");
}
monadをrunするみたいな感じかmrsekut.icon
await するか、適切なランタイムで実行する必要がある
tokioで複数の非同期タスクを並列実行する様子
code:rs
use 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
https://tech-blog.optim.co.jp/entry/2020/03/05/160000?utm_source=feed
https://keno-ss.hatenadiary.org/entry/2019/12/01/235828
https://tech.uzabase.com/entry/2019/09/17/193206
https://qiita.com/legokichi/items/1beb3dce317ef45a927b
https://qiita.com/legokichi/items/53536fcf247143a4721c
https://fasterthanli.me/articles/understanding-rust-futures-by-going-way-too-deep
https://blog.ojisan.io/think-rust-async-part1/
https://keno-ss.hatenadiary.org/entry/2019/12/01/235828
https://qiita.com/qnighy/items/05c38f73ef4b9e487ced
https://qiita.com/qnighy/items/59133e69a0ba0c6a7fef
https://blog.logrocket.com/a-practical-guide-to-async-in-rust/