PHpullh
학습 라이브러리/Kotlin/취소와 타임아웃 (Cancellation & Timeout)

KOTLIN · 비동기

취소와 타임아웃 (Cancellation & Timeout)

코루틴의 협력적 취소 메커니즘과 타임아웃 처리를 다룹니다. 안전한 리소스 정리 패턴을 포함합니다.

비동기중급cancellationtimeoutNonCancellableisActive

핵심 설명

코루틴의 협력적 취소 메커니즘과 타임아웃 처리를 다룹니다. 안전한 리소스 정리 패턴을 포함합니다.

Kotlin code

import kotlinx.coroutines.*

suspend fun longRunningTask(): String {
    try {
        repeat(10) { i ->
            println("작업 중: ${i + 1}/10")
            delay(200)  // 취소 지점
        }
        return "완료"
    } finally {
        // 취소되어도 실행됨
        withContext(NonCancellable) {
            println("리소스 정리 중...")
            delay(100)
            println("정리 완료")
        }
    }
}

fun main() = runBlocking {
    // 수동 취소
    val job = launch { longRunningTask() }
    delay(500)
    println("취소 요청")
    job.cancelAndJoin()

    println("---")

    // 타임아웃 (null 반환)
    val result = withTimeoutOrNull(500) {
        longRunningTask()
    }
    println("결과: ${result ?: "타임아웃"}")

    println("---")

    // isActive 확인 (CPU 바운드 작업)
    val cpuJob = launch(Dispatchers.Default) {
        var i = 0
        while (isActive) {
            i++
            if (i % 1000000 == 0) println("반복: $i")
        }
        println("CPU 작업 종료")
    }
    delay(100)
    cpuJob.cancelAndJoin()
}

학습 팁

withTimeoutOrNull은 타임아웃 시 예외 대신 null을 반환하여 더 안전합니다.

주의할 점

CPU 바운드 작업은 delay 같은 중단점이 없으면 취소에 응답하지 않습니다. isActive를 직접 확인하거나 ensureActive()를 호출하세요.

자주 묻는 질문

취소와 타임아웃 (Cancellation & Timeout)란 무엇인가요?

코루틴의 협력적 취소 메커니즘과 타임아웃 처리를 다룹니다. 안전한 리소스 정리 패턴을 포함합니다.

취소와 타임아웃 (Cancellation & Timeout) 학습 시 주의할 점은 무엇인가요?

CPU 바운드 작업은 delay 같은 중단점이 없으면 취소에 응답하지 않습니다. isActive 를 직접 확인하거나 ensureActive() 를 호출하세요.