개발일지

Kotlin in A..Z - Coroutine(4) async 본문

Kotlin (코틀린)

Kotlin in A..Z - Coroutine(4) async

강태종 2020. 10. 27. 21:11

suspend함수는 순차적으로 실행되는게 기본이다.

fun main() = runBlocking {
    val time = measureTimeMillis {
        val one = doSomethingOne()
        val two = doSomethingTwo()

        println("Result : ${one + two}")
    }

    println("Time : $time")
}

suspend fun doSomethingOne(): Int {
    delay(1000L) // 무거운 작업
    return 10 // 결과 리턴
}

suspend fun doSomethingTwo(): Int {
    delay(1000L) // 무거운 작업
    return 20 // 결과 리턴
}
Result : 30
Time : 2025

async

하지만 doSomethingOne과 doSomethingTwo가 서로 연관이 없는 작업이라면 둘을 동시에 시켜서 결과를 합하는게 이득이다.

async는 Defferd(Job을 상속한 인터페이스)를 반환한다. 기본적으로 바로 실행되고 결과 값이 필요할 때 await로 받을 수 있다.

fun main() = runBlocking {
    val time = measureTimeMillis {
        val one = async { doSomethingOne() }
        val two = async { doSomethingTwo() }

        println("Result : ${one.await() + two.await()}")
    }

    println("Time : $time")
}

suspend fun doSomethingOne(): Int {
    delay(1000L) // 무거운 작업
    return 10 // 결과 리턴
}

suspend fun doSomethingTwo(): Int {
    delay(1000L) // 무거운 작업
    return 20 // 결과 리턴
}
Result : 30
Time : 1021

 

await() 함수는 async로 생성된 Job이 끝날 때까지 기다리고 결과값을 리턴하는 함수이다.


Lazy Async

CoroutineStart.Lazy를 사용하여 async를 바로 시작하는 것이 아닌 시작점을 설정할 수 있다.

fun main() = runBlocking {
    val time = measureTimeMillis {
        val one = async { doSomethingOne() }
        val two = async(start = CoroutineStart.LAZY) { doSomethingTwo() }


        /* start로 await전에 시작할 수도 있음
        two.start()
         */

        println("Result : ${one.await() + two.await()}")
    }

    println("Time : $time")
}

suspend fun doSomethingOne(): Int {
    delay(1000L) // 무거운 작업
    return 10 // 결과 리턴
}

suspend fun doSomethingTwo(): Int {
    delay(1000L) // 무거운 작업
    return 20 // 결과 리턴
}
Result : 30
Time : 2032

 

start() 함수나, await() 함수를 사용하여 시작할 수 있다.

Comments