Kotlin/포스팅

코루틴 타임아웃

짜집퍼박사(짜박) 2024. 1. 9. 18:11

코루틴 타임아웃은 코루틴이 일정 시간 내에 완료되지 않으면 취소되도록 하는 기능을 제공합니다. 이를 통해 특정 작업이 지정된 시간 내에 완료되지 않으면 타임아웃 예외가 발생하고, 코루틴이 중단됩니다. 코루틴 타임아웃은 withTimeout 및 withTimeoutOrNull 함수를 통해 구현됩니다.

 

1. withTimeout 함수

withTimeout 함수는 주어진 시간 동안 코루틴을 실행하다가 지정된 시간을 초과하면 TimeoutCancellationException 예외가 발생하여 코루틴이 취소됩니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    try {
        withTimeout(2000) {
            repeat(3) { i ->
                delay(500)
                println("Task $i is running")
            }
        }
    } catch (e: TimeoutCancellationException) {
        println("Task has timed out")
    }
    println("End")
}

위의 예제에서는 withTimeout 함수를 사용하여 2초 동안 코루틴을 실행하고 있습니다. 각 작업은 500ms마다 실행되고, 전체 작업 시간이 2초를 초과하면 TimeoutCancellationException이 발생합니다.

 

2. withTimeoutOrNull 함수

withTimeoutOrNull 함수는 withTimeout과 유사하지만, 타임아웃이 발생할 경우 예외를 던지지 않고 null을 반환합니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val result = withTimeoutOrNull(2000) {
        repeat(3) { i ->
            delay(500)
            println("Task $i is running")
        }
        "Task completed successfully"
    }
    println("Result: $result")
}

위의 예제에서는 withTimeoutOrNull 함수를 사용하여 2초 동안 코루틴을 실행하고 있습니다. 작업이 정상적으로 완료되면 "Task completed successfully"를 반환하고, 타임아웃이 발생하면 null을 반환합니다.

 

3. onTimeout 블록

withTimeout 및 withTimeoutOrNull 함수는 선택적으로 onTimeout 블록을 제공할 수 있습니다. 이 블록은 타임아웃이 발생했을 때 추가로 실행됩니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val result = withTimeoutOrNull(2000) {
        repeat(3) { i ->
            delay(500)
            println("Task $i is running")
        }
        "Task completed successfully"
    }
    println("Result: $result")
}

 

4. 취소된 코루틴의 처리

코루틴이 취소되면 예외가 발생하므로, 이 예외를 처리할 수 있습니다. 예외를 잡아서 추가적인 로직을 수행하거나 로깅하는 등의 작업이 가능합니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    try {
        withTimeout(2000) {
            repeat(3) { i ->
                delay(500)
                println("Task $i is running")
            }
        }
    } catch (e: TimeoutCancellationException) {
        println("Task has timed out")
        // 취소된 코루틴에 대한 추가 작업 수행 가능
    }
    println("End")
}

코루틴 타임아웃은 일정 시간 내에 작업을 수행하고자 할 때 유용하며, 외부 리소스의 대기 시간을 효과적으로 관리할 수 있습니다. 타임아웃을 적절히 설정하여 코루틴이 지정된 시간 내에 수행되도록 보장할 수 있습니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코루틴 예외 처리  (0) 2024.01.09
코루틴 디스패치  (0) 2024.01.09
코루틴 취소  (0) 2024.01.09
코루틴 잡 생명 주기  (0) 2024.01.09
코루틴 흐름 제어  (0) 2024.01.09