코루틴 타임아웃은 코루틴이 일정 시간 내에 완료되지 않으면 취소되도록 하는 기능을 제공합니다. 이를 통해 특정 작업이 지정된 시간 내에 완료되지 않으면 타임아웃 예외가 발생하고, 코루틴이 중단됩니다. 코루틴 타임아웃은 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