이번에는 코루틴에서 타임아웃 기능을 구현해보자.
너무 뜬금없이 타임아웃 얘기를 해서 살짝 첨언해보자면,
API request를 보내고 response에 기본 타임아웃이 있듯 타임아웃을 만들어보자는 것이다.
따라서 내가 소개할 메소드는 withTimeout, withTimeoutOrNull 총 2가지이다.
가장 큰 차이는 예외 발생 여부이다.
(여기서 말하는 예외는 TimeoutCancellationException으로 기타 다른 예외들은 당연히 발생할 수 있다.)
코드와 함께 살펴보도록 하자.
withTimeout
fun main() = runBlocking {
try {
withTimeout(1000L) {
// some behaviors
}
} catch(e: TimeoutCancellationException) {
e.printStackTrace()
}
println("runBlocking ends")
}
withTimeout은 기본적으로 suspend function이기 때문에 특정 코루틴 스코프 안에서 실행되어야 한다.
그럼.. 이 녀석의 CoroutineContext는 무엇일까?
예제에서는 runBlocking을 실행시킨 Main이 된다.
그리고 코드를 보면 try-catch문으로 withTimeout을 감싸두었다.
그 이유가 뭘까?
withTimeout 파라미터에 전달한 시간 안에
해당 코루틴 작업이 완료되지 않으면 TimeoutCancellationException을 throw한다.
따라서 해당 Exception의 여파로 runBlocking이 종료되지 않도록 예제 코드를 작성해보았다.
withTimeoutOrNull
반면에 withTimeoutOrNull은 어떨까?
먼저 코드를 보자.
fun main() = runBlocking {
val version = withTimeoutOrNull(1000L) {
// some api result
}
if (version == null) {
println("version is null")
}
println("runBlocking ends")
}
곧바로 차이점이 보일 것이다.
가장 큰 차이는 try-catch를 사용하지 않았다는 점이다.
withTimeoutOrNull은 전달한 시간 내에 코루틴 작업이 완료되지 않으면 null을 리턴한다.
나에게 둘 중 하나만 사용하라고 한다면 withTimeoutOrNull을 사용할 것 같다.
'Language > Kotlin' 카테고리의 다른 글
Extract retry logic into higher order function from previous Coroutine (0) | 2024.08.25 |
---|---|
Implement Coroutines Retry (1) | 2024.06.05 |
async CoroutineBuilder Introduction (0) | 2024.05.27 |
Coroutines 기본적인 에러 처리하기(feat. try-catch) (0) | 2024.05.08 |
Coroutines의 Main safety (0) | 2024.05.07 |