개발

coroutine - runBlocking, coroutineScope, suspend

kwony 2023. 2. 28. 20:30

runBlocking

 

runBlocking은 코루틴 월드에 있지 않는 곳과 코루틴 월드를 이어주는 대표적인 함수다. 일반 메인 함수에서는 launch, async 같은 코루틴을 실행할 수 없는데 runBlocking을 이용해 코루틴 월드에 진입하면 실행 할 수 있게 된다. 이름에서도 유추할 수 있듯이 runBlocking은 내부 코루틴 작업이 완료될 때까지 동안 쓰레드를 잠시 일시 중지(blocked)시킨다. 쓰레드를 마구잡이로 중단시키는건 비효율적인 작업이기 때문에 runBlocking을 사용하는 코드는 대부분 애플리케이션 최상위 계층에 존재한다.

 

fun main() {
    runBlocking {
        launch {
            delay(2000)
            println("Hello1")
        }
        launch {
            delay(1000)
            println("Hello2")
        }
    }
}

Hello2
Hello1

 

코루틴 월드 내에서 실행된 코루틴은 병렬로 처리된다. 위 코드에서 Hello2가 먼저 출력되는 이유도 두 코루틴 작업이 병렬로 처리됐기 때문이다.

 

coroutineScope

 

하지만 종종 특정 작업은 순서대로 처리할 필요가 있대. 이런 경우 coroutineScope을 사용하면 된다. 작업을 마칠 때까지 기다린다는 점에서 runBlocking과 유사하지만 쓰레드를 block 시키진 않고 그 이후 작업만 처리하지 않도록 한다.

 

fun main() {
    runBlocking {
        launch {
            delay(2000)
            println("Hello1")
        }
        doSomething()
        launch {
            delay(1000)
            println("Hello2")
        }
    }
}

suspend fun doSomething() = coroutineScope{
    launch {
        delay(3000)
        println("help")
    }
    println("doSomething")
}

doSomething
Hello1
help
Hello2

 

위의 코드를 실행결과를 살펴보면 doSomething 내부 출력 결과인 help보다 doSomething이 호출이 되기 전에 첫번째로 실행됐던 코루틴의 결과가 먼저 출력된다. doSomething 내에서 쓰레드를 블록시키지 않았기 때문에 Hello1이 먼저 출력될 수 있었다. 단 Hello2는 doSomething 코루틴이 모두 종료된 후 시작될 수 있기 때문에 출력되지 않는다. 차이를 알아가는게 중요할 것 같다.

 

 

 

Coroutines basics | Kotlin

 

kotlinlang.org