← Rust

LESSON / ARTICLE

非同期処理の基礎

非同期処理の基礎を学び、実務での設計判断につなげます。

非同期処理

I/O待ち時間にスレッドを占有せず別の仕事へ切り替える考え方が非同期処理です。スレッド並行処理とは目的が異なり、組み合わせて使われます。

Future

Futureは完了していない処理を表し、executorがpollして進行を確認します。

use std::future::Future;
async fn load()->u32{42}
fn accepts<F:Future<Output=u32>>(_:F){}
fn main(){accepts(load());}

この例はFutureを作るだけで実行しません。標準ライブラリに汎用executorはないため、実用アプリでは要件に合うランタイムを選びます。

  • async関数の呼び出しはFutureを返す
  • awaitは完了を待つ地点
  • ブロッキング処理はexecutorを止める場合がある
  • キャンセルやタイムアウトも設計する

設計確認

I/O待ち中に別タスクが進められる理由と、CPU負荷の高い処理をasyncタスク内で直接実行した場合の問題を説明してください。