1 분 소요

Coroutine을 본격적으로 사용하기 전에 코루틴이 어떻게 해야 동기처리 되는지, 그리고 어떻게 해야 비동기 처리 되는지 알아보고자 한다.

먼저, 간단한 코드를 보고 설명하겠다.

fun main() {
    CoroutineScope(Dispatchers.Default).launch {
        drawHead()
        drawBody()
        drawLegs()
    }.join()
}

suspend fun drawHead() {
    delay(1000)
}

suspend fun drawBody() {
    delay(2000)
}

suspend fun drawLegs() {
    delay(3000)
}

위 코드는 순차적으로 동작했을 경우 6초가, 비동기로 동작했을 경우에는 3초가 걸리는 코드이다.

어떻게 동작할까 ?

Coroutine으로 만들었으니 비동기로 동작해서 3초걸리겠지 ! 할 수도 있겠으나, 위 코드는 하나의 Coroutine Builder에서 모든 서브루틴을 호출했기 때문에 순차적으로 동작한다.

import kotlinx.coroutines.* import kotlin.time.ExperimentalTime import kotlin.time.measureTime @OptIn(ExperimentalTime::class) fun main() = runBlocking { println("make person start") measureTime { CoroutineScope(Dispatchers.IO).launch { drawHead() drawBody() drawLegs() }.join() }.also { println(it) } println("make person end") } suspend fun drawHead() { println("drawHead start") delay(1000) println("drawHead end") } suspend fun drawBody() { println("drawBody start") delay(3000) println("drawBody end") } suspend fun drawLegs() { println("drawLegs start") delay(2000) println("drawLegs end") }

출력된 로그와 같이 머리를 그리고, 끝나면 몸을 그리고, 몸을 그리는게 끝나면 다리를 그린다.
이렇게 순차적으로 진행되어 6초가량 걸리는 것을 확인할 수 있다.

그렇다면, 이 코드를 비동기로 작동시키고 싶다면 어떻게 해야할까?

각각의 서브루틴을 코루틴빌더로 빌드하면 된다.

아래의 코드는 하나의 코루틴 빌더 내에서 각각을 한번 더 코루틴 빌더로 감싸주었다.
이 코드는 얼마나 걸리는지 실행해보자.

import kotlinx.coroutines.* import kotlin.time.ExperimentalTime import kotlin.time.measureTime @OptIn(ExperimentalTime::class) fun main() = runBlocking { println("make person start") measureTime { CoroutineScope(Dispatchers.IO).launch { launch { drawHead() } launch { drawBody() } launch { drawLegs() } }.join() }.also { println(it) } println("make person end") } suspend fun drawHead() { println("drawHead start") delay(1000) println("drawHead end") } suspend fun drawBody() { println("drawBody start") delay(3000) println("drawBody end") } suspend fun drawLegs() { println("drawLegs start") delay(2000) println("drawLegs end") }

각각의 서브루틴을 코루틴 빌더로 감쌌더니 비동기로 처리가 되어 3초가량 소요되었다.

이렇듯, 비동기코드를 작성할 때와 동기코드를 작성할 때를 구분해서 필요에 따라 동기/비동기 코드를 작성할 수 있을 것이다.

댓글남기기