📌 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 > 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 |