코루틴 취소가 필요한 이유
더 이상 사용하지 않을 코루틴을 취소하지 않으면 코루틴이 스레드를 계속해서 사용하기 때문에 애플리케이션의 성능 저하로 이어진다.
ex) 동영상 편집 어플 같은것들을 보면 여러 영상을 짜집기해서 긴 영상으로 만드는 작업이 있는데 이런 작업을 요청하고 필요가 없어져도 계속 켜두면 당연 성능에 좋지 않을 것이다.
cancel() 함수를 사용하면 코루틴에게 취소 요청을 할 수 있다. (코루틴이 바로 취소되는게 아니다.) 취소 확인용 플래그의 값을 '취소 요청됨' 으로 바꾸는 역할을 해준다. 이후 미래에 취소가 확인될때 코루틴이 취소된다.
아래의 예제의 결과를 살펴보면 금방 이해할 수 있을 것이다.
import kotlinx.coroutines.*
fun main() = runBlocking<Unit> {
val longJob : Job = launch(Dispatchers.Default) {
Thread.sleep(1000) // sleep은 blocking 메소드임.
println("longJob 코루틴의 동작")
}
longJob.cancel()
callAfterCancelCoroutine()
}
fun callAfterCancelCoroutine() {
println("이 로그는 코루틴이 실행 취소되고나서 보여야함")
}
코드를 실행해보면 1초뒤에 longJob 코루틴 동작이 로그로 찍힌다.
코루틴이 취소된 후 실행되야 하는 코루틴이 있다면 코루틴을 취소할때 cancelAndJoin 메소드를 이요하면 된다.
단, 이때 delay 메소드와 sleep 메소드의 차이를 반드시 유의하고 사용해야 한다.
sleep -> 코루틴의 취소 확인시점이 존재하지 않는다.
delay -> 코루틴의 취소 확인 시점이 존재한다.
fun main() = runBlocking<Unit> {
val longJob: Job = launch(Dispatchers.Default) {
// sleep 메소드는 블로킹 메소드다. delay 메소드를 주석처리하고 sleep메소드를 실행해보면 longJob의 로그가 계속 찍힌다. 그 이유는 sleep 메소드에는 코루틴의 중단 확인 시점이 존재하지 않기 때문이다.
//sleep(1000)
// 코루틴의 중단 확인 시점이 존재하는 메소드다.
delay(1000)
println("longJob 코루틴의 동작")
}
longJob.cancelAndJoin()
executeAfterJobCancelled2()
}
fun executeAfterJobCancelled2() {
println("longJob 코루틴 취소 후 실행되야하는 동작")
}
'코루틴' 카테고리의 다른 글
코루틴의 다양한 상태값들 (0) | 2025.02.13 |
---|