본문 바로가기

Kotlin/kotlinx.coroutines

cancel

📌 Kotlin Coroutines에서 cancel 사용하기

1. 개요

Kotlin의 cancel 함수는 코루틴을 안전하게 종료하는 기능을 제공합니다. 이를 통해 실행 중인 작업을 중단하고, 필요한 경우 예외 메시지와 원인을 전달할 수 있습니다.

코루틴의 취소는 협력적(cooperative) 방식으로 이루어지므로, 코루틴 내부에서 주기적으로 취소 상태를 확인해야 합니다.

2. 함수 시그니처

cancel 함수는 여러 가지 형태로 제공됩니다.


fun CoroutineScope.cancel(cause: CancellationException? = null)
fun CoroutineScope.cancel(message: String, cause: Throwable? = null)
fun CoroutineContext.cancel(cause: CancellationException? = null)
fun Job.cancel(message: String, cause: Throwable? = null)

3. 기본 사용법

코루틴을 실행한 후 cancel()을 호출하여 종료할 수 있습니다.


import kotlinx.coroutines.*

fun main() = runBlocking {
    val scope = CoroutineScope(Dispatchers.Default)

    scope.launch {
        // 실행 중인 코루틴
    }

    // 스코프 내 모든 코루틴 취소
    scope.cancel()
}

위 코드에서는 CoroutineScope 내에서 실행 중인 모든 코루틴을 scope.cancel()을 통해 중단합니다.

4. 메시지 및 예외와 함께 취소

특정한 이유를 포함하여 코루틴을 취소할 수도 있습니다.


import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        delay(2000L)
        println("이 메시지는 출력되지 않습니다.")
    }

    delay(1000L)
    job.cancel("Timeout 발생", TimeoutCancellationException("Timeout"))
}

위 코드에서는 2초 후 실행될 코드가 job.cancel() 호출로 인해 실행되지 않고 종료됩니다.

5. 취소가 반영되지 않는 경우

cancel()을 호출한다고 해서 모든 경우에 즉시 취소되는 것은 아닙니다. 특히, CPU 집중 연산과 같은 작업을 수행하는 코루틴은 취소 신호를 인지하지 못할 수도 있습니다.


import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        while (true) {
            // 무한 루프 - 취소가 반영되지 않음
            println("실행 중...")
        }
    }

    delay(1000L)
    job.cancel()
    println("코루틴 취소 요청됨.")
}

위 코드에서는 job.cancel()을 호출했음에도 불구하고, while (true) 루프가 계속 실행되기 때문에 취소가 반영되지 않습니다.

6. 취소가 반영되도록 만들기

취소를 반영하려면 yield() 또는 isActive를 사용하여 주기적으로 취소 상태를 확인해야 합니다.


import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        while (isActive) { // 코루틴이 활성 상태인지 확인
            println("실행 중...")
            delay(500L)
        }
    }

    delay(1000L)
    job.cancel()
    println("코루틴 취소 완료.")
}

위 코드에서는 isActive를 사용하여 코루틴이 취소되었는지 확인하고, 필요할 경우 루프를 종료합니다.

📌 원본 출처

본 문서의 예제와 내용은 Kotlin 공식 문서를 참고하여 작성되었습니다. 자세한 내용은 아래 공식 문서를 통해 확인할 수 있습니다.

🔗 Kotlin Coroutines 공식 문서 - cancel

'Kotlin > kotlinx.coroutines' 카테고리의 다른 글

cancelChildren  (0) 2025.02.07
cancelAndJoin  (0) 2025.02.07
awaitCanellation  (0) 2025.02.07
awaitAll  (0) 2025.02.07
await  (0) 2025.02.07