본문 바로가기

Kotlin/kotlinx.coroutines

awaitAll

📌 Kotlin Coroutines에서 awaitAll 사용하기

1. 개요

Kotlin의 awaitAll 함수는 여러 개의 Deferred 값을 동시에 기다릴 수 있는 비동기 동시 실행 기능을 제공합니다.

해당 함수는 모든 Deferred 작업이 완료될 때까지 대기한 후, 결과 리스트를 반환합니다. 만약 하나라도 실패하거나 취소되면 awaitAll은 즉시 예외를 발생시킵니다.

2. 기본 사용법

다음은 awaitAll을 활용하는 기본적인 예제입니다.


import kotlinx.coroutines.*

fun main() = runBlocking {
    val deferred1 = async { delay(1000L); "Result 1" }
    val deferred2 = async { delay(2000L); "Result 2" }
    val deferred3 = async { delay(1500L); "Result 3" }

    val results = listOf(deferred1, deferred2, deferred3).awaitAll()
    println("Results: $results")
}

위 코드에서 awaitAll을 사용하여 deferred1, deferred2, deferred3의 완료를 동시에 기다린 후, 결과를 리스트로 반환받습니다.

3. awaitAll과 예외 처리

awaitAll은 하나의 Deferred가 예외적으로 종료되면 즉시 예외를 던집니다.


import kotlinx.coroutines.*

fun main() = runBlocking {
    val deferred1 = async { delay(1000L); "Success" }
    val deferred2 = async { delay(500L); throw Exception("Error Occurred") }
    val deferred3 = async { delay(1500L); "Will not execute" }

    try {
        val results = listOf(deferred1, deferred2, deferred3).awaitAll()
        println("Results: $results")
    } catch (e: Exception) {
        println("Caught exception: ${e.message}")
    }
}

위 예제에서는 deferred2가 500ms 후 예외를 발생시키면서 awaitAll이 즉시 예외를 던지고, 나머지 Deferred는 실행되지 않습니다.

4. awaitAll 함수의 두 가지 형태

awaitAll 함수에는 두 가지 형태가 존재합니다.

  • **Vararg Parameter 버전**
    
    suspend fun  awaitAll(vararg deferreds: Deferred): List
            
    여러 개의 Deferred 값을 인자로 전달할 수 있습니다.
  • **Collection Extension 버전**
    
    suspend fun  Collection<Deferred>.awaitAll(): List
            
    Deferred 객체의 컬렉션에서 확장 함수로 사용할 수 있습니다.

📌 원본 출처

본 문서의 예제와 내용은 Kotlin 공식 문서를 참고하여 작성되었습니다. 자세한 내용은 아래 공식 문서를 통해 확인할 수 있습니다.

🔗 Kotlin Coroutines 공식 문서 - awaitAll

'Kotlin > kotlinx.coroutines' 카테고리의 다른 글

cancel  (0) 2025.02.07
awaitCanellation  (0) 2025.02.07
await  (0) 2025.02.07
async  (0) 2025.02.06
asContextElement  (0) 2025.02.06