Kotlinの並行処理における「suspend関数」と「async/await」は、非同期プログラミングをシンプルかつ直感的に実装するための重要な機能です。以下に、それぞれの仕組みと特徴を詳しく説明します。
1. suspend関数とは
suspend関数とはsuspend関数は、コルーチンの中で一時中断(suspend)可能な関数です。これは通常の関数と異なり、処理を一時的に停止し、再開することができます。
特徴:
-
中断と再開が可能な関数(例:ネットワークアクセスやI/O操作など時間のかかる処理に適している)
-
コルーチンのコンテキスト内でのみ呼び出し可能
-
suspendキーワードを関数定義の前につける
例:
このようなsuspend関数は、CPUをブロックせずに処理を一時停止できます。
2. asyncとawaitとは
asyncとawaitとはsuspend関数を並列的に非同期実行し、その結果を待ちたい場合に使うのが、asyncとawaitの組み合わせです。
asyncの役割:
asyncの役割:-
非同期処理の開始
-
Deferred<T>(将来値を保持するオブジェクト)を返す
awaitの役割:
awaitの役割:-
Deferredの完了を待機し、結果を取得 -
suspend関数の中でのみ使用可能
例:
解説:
上記の例では、fetchData1とfetchData2が同時に実行され、await()でそれぞれの完了を待っています。これにより、合計実行時間は約1秒となり、直列に実行した場合(2秒)より高速です。
3. 比較: launchとの違い
launchとの違い| 機能 | async |
launch |
|---|---|---|
| 戻り値 | Deferred<T>(結果を持つ) |
Job(結果なし) |
| 使い道 | 非同期処理の結果を使う時 | 単に処理を非同期で走らせるだけ |
await() |
可能 | 不可(代わりにjoin()を使用) |
まとめ
-
suspend関数はコルーチン内で一時停止できる関数 -
asyncは並行タスクを非同期で起動し、Deferredとして結果を返す -
awaitはその結果を待ち受けるためのsuspend関数 -
並行処理によって、待機時間を短縮し効率的なプログラムが可能になる
生成日:2025/05/04