2025/05/06
はじめに
Rustのtokioで非同期処理を行う場合、基本的には非同期関数を使用しますが、外部クレートなどで非同期対応していない場合、blockingな処理をtokioランタイム内で実行することがある。 そこで、間違った方法で実行すると、tokioの非同期処理がブロックされてしまうため、注意が必要となる。
解決コード
async fn call_hoge() {
tokio::task::spawn_blocking(move || {
hoge_blocking_function();
}).await.expect("failed to call hoge_blocking_function");
}
Available on crate feature rt only.
なので、使えない場合はfeatuersを調整する必要があるかもしれない。
だめなコード
async fn call_hoge() {
hoge_blocking_function();
}
おわりに
外部クレートを利用したコードを書く時に、気を抜いていると、間違えて非同期ランタイムをブロックしてしまうことがあるので、注意が必要です。
思ったより性能が出ない場合や、処理が止まっている事象が発生したら、ブロッキングな処理をそのまま呼び出している可能性があります。 この場合、IOが絡む処理や、OSイベントを待つ処理などが要注意となります。