generated at
Rustの非同期処理



参考
2019/11
長過ぎるが、良い


割と変遷があったっぽく、最新の状況を理解するための良い資料がどれなのかわからないmrsekut
書籍や記事を参考にする際も、いちいち書かれた日を注意して読まないといけない




Futureの糖衣構文
Rust v1.39で入った
非同期操作を表す抽象型
Rustの非同期システムの中心
非同期処理を実行するためのエンジン
特定のユースケース向けのライブラリ
e.g. reqwest
上記の何らかのruntime上で動作する


>tokio は 3rd party のライブラリです。そこで JS などを経験した人は、「どうして非同期処理が 3rd party library なの?」と思うかもしれません。
> Rust(std) そのものには非同期処理の仕組み自体はあります。 しかし非同期のタスク群をスケジューリングして実行する仕組みがありません。 これはユーザーもしくはライブラリに任されています。 tokio が提供しているのはそのための schedular や executor です。
>Rustの非同期プログラミングはあらゆるプラットフォームで動くように設計されています。 一般的によく使われるWebサーバーやGUIアプリケーションはもちろん、 WebAssemblyでも薄いランタイムライブラリだけで動くようになっていますし、 果ては組み込み(ベアメタル)環境でも動くようになっているのです。


>ここまでで非同期関数や非同期ブロックで非同期タスクを作る方法を紹介しましたが、このままではタスクを実行することは出来ません。
> 例えば下記のコードを実行しても、表示されるのは一番下の"piyo"のみです。
rs
async fn hoge() { println!("hoge"); } fn main() { let _ = hoge(); let _ = async { println!("fuga"); }; println!("piyo"); }
monadをrunするみたいな感じかmrsekut
await するか、適切なランタイムで実行する必要がある

tokioで複数の非同期タスクを並列実行する様子
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