본문 바로가기

Coroutine

Coroutines - Part. 3 withTimeout(), withTimeoutOrNull()

728x90

withTimeout()

코루틴에는 Timeout 동작을 간단히 처리할 수 있도록 withTimeout() 함수가 kotilnx.couroutines 패키지에 포함되어 있다.

withTimeout(a, b)

a : 작업을 수행할 시간 (millisecond)

b : 수행할 블록 함수

fun main() = runBlocking {
    withTimeout(3000) {
        repeat(1000) { i ->
            println("job : $i")
            delay(500)
        }
    }
}

실행결과:

job : 0
job : 1
job : 2
job : 3
job : 4
job : 5
TimeoutCancellationException : Timed out waiting for 3000 ms

위 코드를 실행시키면 3초간 실행되다가 작업을 취소하는 순간 TimeoutCancellationException이 발생하게 된다. 작업 취소보단 강제 중지라고 보는게 맞다.

이 경우 try-catch를 이용해 TimeoutCancellationException을 처리할 수 있다.

fun main() = runBlocking {
    try {
        withTimeout(3000) {
            repeat(1000) { i ->
                println("job : $i")
                delay(500)
            }
        }
    }catch (e: Exception){
        println("job : $e")
    }
}

실행결과: 

job : 0
job : 1
job : 2
job : 3
job : 4
job : 5
job : kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 3000 ms

하지만 try-catch를 이용해도 결국 Exception은 발생하는 것을 볼 수 있다. 그럼 코틀린에서 제공하는 withTimeoutOrNull() 함수를 사용하는 방법도 있다.

withTimeoutOrNull()

withTimeoutOrNull() 함수도 kotlinx.coroutines 패키지에 포함되어 제공된다.

fun main() = runBlocking {
    val job = withTimeoutOrNull(3000) {
        repeat(10) { i ->
            println("job : $i")
            delay(500)
        }
        "Done"
    }

    println("Job is $job")
}

위의 코드가 시간 내에 정상 종료를 하게되면 "Done"을 반환받을 수 있다. 만약 시간 내 정상 처리되지 못하면 TimeoutCancellationException 대신 null을 반환받게 된다.