본문 바로가기

Language

[Kotlin] 코루틴 (2) - Cancellation and Timeouts

 

중단함수 : 실행 중 취소 가능한 구간마다 취소 요청이 있었는지 확인하고 요청이 있었다면 실행을 즉시 취소하도록 구현

runBlocking {
    val job = launch(Dispatchers.Default) {
        for (i in 1..10) {
            yield()
            println("I'm sleeping $i ...")
            Thread.sleep(500L)
        }
    }

    delay(1300L)
    println("main : I'm tired of waiting!")
    job.cancelAndJoin()
    println("main : Now I can quit.")
}
runBlocking {
    val job = launch(Dispatchers.Default) {
        for (i in 1..10) {
            if (!isActive){
                break
            }
            println("I'm sleeping $i ...")
            Thread.sleep(500L)
        }
    }

    delay(1300L)
    println("main : I'm tired of waiting!")
    job.cancelAndJoin()
    println("main : Now I can quit.")
}

- 위 코드블록에서 취소요청 : job.cancelAndJoin()

- 위 코드블록에서 중단함수 : yield(), if(!isActive) break 

- 중단함수들은 취소되면 CancellationException 을 발생

 

 

Dispatch

- JVM 에서 백그라운드 작업을 수행하기 위해 적용
- launch {}, async {} 등의 코루틴 빌더를 통해 코루틴을 생성 및 실행할 때, 코루틴이 속한 코루틴 스코프에 적용
- Default, IO, Main, Unconfined
- 코루틴을 실행할 때
	- CPU 사용이 주를 이루는 작업은 Dispatchers.Default 를 사용
	- Network, Disk I/O 가 주를 이루는 작업은 Dispatchers.IO 를 사용

 

 

 

withContext : 스레드 전환을 안전하게 하기 위해서 사용

runBlocking {
    val job = launch {
        try {
            repeat(1000) { i ->
                println("I'm sleeping $i ...")
                delay(500L)
            }
        } finally {
            withContext(NonCancellable) {
                delay(1000)
                println("main : I'm running finally!")
            }
        }
    }

    delay(1300L)
    println("main : I'm tired of waiting!")
    job.cancelAndJoin()
    println("main : Now I can quit.")
}

- withContext 없이 delay() 중단함수를 호출할 경우 현재 코루틴 컨텍스트는 이미 취소된 상태라서 또 다른 중단 함수를 호출할 수 없음

- NonCancellable : 작업이 취소되지 않도록 보장하는 특별한 컨텍스트

suspend fun getUser(): User {
    return withContext(Dispatchers.IO) {
        api.fetchUser()
    }
}

- Dispatchers.IO : 명시적으로 IO 스레드에서 실행됨을 보장

 

 

withTimeout : 제한 시간을 설정 할 대상이 되는 코루틴을 생성

runBlocking {
    withTimeout(1300L) {
        launch {
            try {
                repeat(1000) { i ->
                    println("I'm sleeping $i ...")
                    delay(500L)
                }
            } finally {
                println("main : I'm running finally!")
            }
        }
    }
}

- 1.3초 후 TimeoutCancellationException 이 발생

 


https://myungpyo.medium.com/reading-coroutine-official-guide-thoroughly-part-0-20176d431e9d

 

Reading Coroutine official guide thoroughly — Part 0

요즘 안드로이드 앱 개발자들은 주개발 언어가 Java 에서 Kotlin 으로 많이 전환 되고 있다고 생각합니다. iOS 가 objective-c 에서 swift 로 전환할 때 처럼 안드로이드 SDK 공식 가이드에서도 Kotlin 과 Java

myungpyo.medium.com

 

'Language' 카테고리의 다른 글

[Kotlin] - Channels  (0) 2025.02.09
[Kotlin] - 기본 문법 정리  (1) 2025.02.02
[Kotlin] 제네릭 generic타입  (0) 2025.02.02
[Kotlin] 코루틴 (1) - Basic  (1) 2025.02.01