suspend関数とasync/await

Kotlinの並行処理における「suspend関数」と「asyncawait」は、非同期プログラミングをシンプルかつ直感的に実装するための重要な機能です。以下に、それぞれの仕組みと特徴を詳しく説明します。


1. suspend関数とは

suspend関数は、コルーチンの中で一時中断(suspend)可能な関数です。これは通常の関数と異なり、処理を一時的に停止し、再開することができます。

特徴:

  • 中断と再開が可能な関数(例:ネットワークアクセスやI/O操作など時間のかかる処理に適している)

  • コルーチンのコンテキスト内でのみ呼び出し可能

  • suspendキーワードを関数定義の前につける

例:

kotlin
suspend fun fetchData(): String { delay(1000) // 一時中断され、1秒後に再開 return "データ取得完了" }

このようなsuspend関数は、CPUをブロックせずに処理を一時停止できます。


2. asyncawaitとは

suspend関数を並列的に非同期実行し、その結果を待ちたい場合に使うのが、asyncawaitの組み合わせです。

asyncの役割:

  • 非同期処理の開始

  • Deferred<T>(将来値を保持するオブジェクト)を返す

awaitの役割:

  • Deferredの完了を待機し、結果を取得

  • suspend関数の中でのみ使用可能

例:

kotlin
import kotlinx.coroutines.* fun main() = runBlocking { val deferred1 = async { fetchData1() } val deferred2 = async { fetchData2() } val result1 = deferred1.await() val result2 = deferred2.await() println("結果: $result1, $result2") } suspend fun fetchData1(): String { delay(1000) return "データ1" } suspend fun fetchData2(): String { delay(1000) return "データ2" }

解説:

上記の例では、fetchData1fetchData2同時に実行され、await()でそれぞれの完了を待っています。これにより、合計実行時間は約1秒となり、直列に実行した場合(2秒)より高速です。


3. 比較: launchとの違い

機能 async launch
戻り値 Deferred<T>(結果を持つ) Job(結果なし)
使い道 非同期処理の結果を使う 単に処理を非同期で走らせるだけ
await() 可能 不可(代わりにjoin()を使用)

まとめ

  • suspend関数はコルーチン内で一時停止できる関数

  • asyncは並行タスクを非同期で起動し、Deferredとして結果を返す

  • awaitはその結果を待ち受けるためのsuspend関数

  • 並行処理によって、待機時間を短縮し効率的なプログラムが可能になる

生成日:2025/05/04