Android Weekly

Android Weekly #-603 "코틀린의 동기 및 비동기 실행"

베블렌 2024. 1. 1. 21:27

1월 1주차에는 안드로이드의 내용보다 코틀린 이나 jetpack관련된 글 밖에없었는데, 그 중 느낌있는 글입니다.

 

https://proandroiddev.com/synchronous-and-asynchronous-runs-run-runcatching-runblocking-and-runinterruptible-in-kotlin-58405c0e6fee

 

Synchronous and Asynchronous runs: run, runCatching, runBlocking and runInterruptible in Kotlin

Deep dive into the work of ‘run’ functions and their differences.

proandroiddev.com

 

 

소개

이 글에서는 코틀린의 동기 및 비동기 실행 함수인 run, runCatching, runBlocking, runInterruptible에 대해 자세히 다룹니다. 글쓴이는 이러한 함수들의 동작 방식과 복잡한 시나리오에서의 사용법을 설명해줍니다.

 

내용

run과 runCatching

  • run은 객체의 컨텍스트 내에서 코드 블록을 실행할 수 있게 해주는 범위 함수입니다. 객체의 속성과 메서드에 직접 접근할 수 있으며, 결과를 반환할 수 있습니다.
  • runCatching은 실행 블록을 try-catch 블록으로 래핑하고 결과를 Result 객체로 반환합니다. 이를 통해 예외 처리를 더욱 용이하게 할 수 있습니다.
val event = Event(id = UUID.randomUUID(), value = 10, message = null)
val isEven = event.run { value % 2 == 0 }
println("Is Event.value even? $isEven.")
val result = event.runCatching {
    value / 0
}.onFailure {
    println("We failed to divide by zero. Throwable: $it")
}.onSuccess {
    println("Division result is $it")
}
println("Returned value is $result")

 

 

비동기 실행: runBlocking과 runInterruptible

  • runBlocking은 현재 스레드를 차단하는 동시에 코루틴 블록을 실행합니다. 주로 메인 함수나 테스트에서 사용되며, 코루틴 컨텍스트 내부에서는 사용을 피해야 합니다.
  • runBlocking은 스레드 관리에 영향을 미칠 수 있으며, ViewModel과 같은 고급 구성요소에서 사용할 때 주의가 필요합니다.
  • runInterruptible은 실행 블록을 중단 가능한 방식으로 호출하며, 스레드를 생성하지 않습니다.
private fun runFlows() {
    thread {
        runCollection()
    }
}

private fun runCollection() {
    runBlocking {
        val eventGenerator = EventGenerator()
        eventGenerator.coldFlow.take(2).collect {
            println("Collection in runCollections #1: $it")
        }
    }
}
fun runInterruptible() {
    viewModelScope.launch {
        kotlin.runCatching {
            withTimeout(100) {
                runInterruptible(Dispatchers.IO) {
                    interruptibleBlockingCall()
                }
            }
        }.onFailure {
            println("Caught exception: $it")
        }
        println("End")
    }
}

private fun interruptibleBlockingCall() {
    Thread.sleep(3000)
}

 

 

 

정리

run, runCatching, runBlocking, runInterruptible은 각각의 사용 사례와 한계가 있습니다. 특히 runBlocking과 runInterruptible은 코루틴의 동작 원리와 스레드 관리에 대한 깊은 이해가 필요합니다. 올바른 상황에서 적절하게 사용하면 효과적이지만, 잘못 사용하면 성능 문제나 예측 불가능한 동작을 초래할 수 있습니다. 따라서 이러한 함수들을 사용할 때는 문서화된 지침을 따르고, 코드의 복잡성과 유지보수 가능성을 고려하여 신중하게 접근해야 합니다.\

실제 테스트 관련한 내용과 자세한 설명은 본문글에 다 있습니다.

 

 

 

https://androidweekly.net/

 

Android Weekly - Free weekly Android & Kotlin development newsletter

Android Weekly - Free weekly Android & Kotlin development newsletter

androidweekly.net