2019-08-03RustのFutureとasync/awaitは、「時間のかかる処理」をするときに、「処理が終わるまでOSスレッドをブロックする(同期Rust)」のではなく、「当該処理を中断して、そのOSスレッドを別のタスクの処理に使う(非同期Rust)」ことで、スレッド数よりも多くの処理を同時に行う仕組みです。同期Rustと非同期Rustには以下のようなアナロジーが成立します。f().await同期Rustから非同期Rustへの移行は、おおよそこのアナロジーにしたがって行えることになります。(ライブラリ・フレームワークも同様に移行される必要があります。)とはいえ、単純置換で移行できるわけではありません。そこで以下でasync/awaitをスムーズに使うためのライブラリやテクニックを紹介します。futures/futures01/futures-previewクレートfuturesは非同期プログラミングのベースになっているライブラリです。futuresには主に2つのバージョンがあります。async/awaitがなかった頃に作られた非同期処理ライブラリ。async/awaitを念頭に置いて整理されている。今ある非同期エコシステムは0.1系ベースのものが多いので、互換性を保つために以下のように書くのがおすすめです。futures01はfuturesの0.1系を指し続けるクレート。0.3系列はまだpreview版のため、別の名前で提供されている。futures::prelude::*;futuresクレートには、標準ライブラリの非同期版がいくつか同梱されています。0.1系を使っているライブラリと相互運用することができます。処理するための構文は将来的には入ることが期待されていますが、すぐには入らない予定です。処理するのがイディオマティックです。...}runtimeクレートruntimeは、非同期ランタイムをまとまった形で提供することを目指しているクレートです。非同期ランタイムの立ち上げを簡略化するための属性マクロも提供しています。...}タスクの起動や非同期ソケットの立ち上げ、タイマーなどのインターフェースが提供されています。runtime::time::Delay::new().await;hyperとの相互運用hyperはデフォルトで自前のtokioランタイムを起動します。featureを無効化しておいたほうが無難です。fnはトレイトやその実装内では使えません。type)が必要で、どちらも実装途上です。fnを含むトレイトは関連型を含むためトレイトオブジェクト化が不可能になります。返すようにすればよいです。}}これはやや面倒です。複数の参照を取るメソッドになると話はさらにややこしくなります。属性マクロを使うと、これをより自然に書くことができます。}}まとめasync/awaitへの移行を容易にする以下のテクニックを紹介しました。