본문 바로가기

Kotlin/kotlinx.coroutines

cancelChildren

📌 Kotlin Coroutines에서 cancelChildren 사용하기

1. 개요

Kotlin의 cancelChildren 함수는 특정 Job이나 CoroutineContext 내에서 실행 중인 모든 자식 코루틴을 취소하는 기능을 제공합니다.

이 함수는 부모 코루틴의 상태를 유지한 채로, 하위 코루틴만을 취소할 때 유용합니다.

2. 함수 시그니처

cancelChildren 함수는 다음과 같이 정의됩니다.


fun Job.cancelChildren(cause: CancellationException? = null)
fun CoroutineContext.cancelChildren(cause: CancellationException? = null)

3. 기본 사용법

다음은 cancelChildren을 활용하는 기본적인 예제입니다.


import kotlinx.coroutines.*

fun main() = runBlocking {
    val parentJob = launch {
        // 3개의 자식 코루틴 생성
        repeat(3) { i ->
            launch {
                try {
                    delay(Long.MAX_VALUE) // 무한 대기
                } finally {
                    println("Child $i is cancelled")
                }
            }
        }
        delay(1000L)
        println("모든 자식 코루틴 취소")
        cancelChildren() // 자식 코루틴만 취소
    }

    parentJob.join()
    println("부모 코루틴 종료")
}

4. 실행 결과

위 코드를 실행하면 다음과 같은 출력이 나타납니다.


모든 자식 코루틴 취소
Child 0 is cancelled
Child 1 is cancelled
Child 2 is cancelled
부모 코루틴 종료

cancelChildren()을 호출하면, 부모 코루틴(parentJob)은 그대로 유지된 상태에서 자식 코루틴들만 취소됩니다.

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

cancelChildren()을 호출하더라도, 하위 코루틴이 취소 가능한 코드로 작성되지 않았다면 취소가 즉시 반영되지 않을 수 있습니다.


import kotlinx.coroutines.*

fun main() = runBlocking {
    val parentJob = launch {
        repeat(3) { i ->
            launch {
                while (true) { // 취소 체크 없이 무한 실행
                    println("Child $i 실행 중...")
                }
            }
        }
        delay(1000L)
        cancelChildren()
        println("자식 코루틴 취소 요청됨")
    }

    parentJob.join()
}

위 코드에서는 while (true) 루프가 계속 실행되므로, cancelChildren()을 호출해도 즉시 종료되지 않습니다.

6. 취소를 반영하기 위한 방법

isActive 또는 yield()를 활용하여 취소 상태를 체크해야 합니다.


import kotlinx.coroutines.*

fun main() = runBlocking {
    val parentJob = launch {
        repeat(3) { i ->
            launch {
                while (isActive) { // 취소 상태 체크
                    println("Child $i 실행 중...")
                    delay(500L)
                }
            }
        }
        delay(1000L)
        cancelChildren()
        println("자식 코루틴 취소 완료")
    }

    parentJob.join()
}

위 코드에서는 isActive를 활용하여 코루틴이 취소될 경우 루프가 중단되도록 처리하였습니다.

📌 원본 출처

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

🔗 Kotlin Coroutines 공식 문서 - cancelChildren

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

CloseableCoroutineDispatcher  (0) 2025.02.07
CancellableContinuation  (0) 2025.02.07
cancelAndJoin  (0) 2025.02.07
cancel  (0) 2025.02.07
awaitCanellation  (0) 2025.02.07