들어가기 전에
두개 이상의 작업을 비동기적으로 실행하려면 어떻게 해야할까요? 한번 알아봅시다.
핵심 키워드
- async
- Deferred<T>
학습하기
들어가기 전에
두개 이상의 작업을 비동기적으로 실행하려면 어떻게 해야할까요? 한번 알아봅시다.
핵심 키워드
학습하기
launch에 정의된 함수는 순차적으로 표현할 수 있습니다. 이 두 개의 함수는 내부적으로 비동기 코드로서 동시에 작동할 수 있지만 코드만 봤을 때는 순차적으로 실행되는 것처럼 표현함으로써 프로그래밍의 복잡도를 낮추게 됩니다.
async 코루틴 빌더 생성
이번엔 async를 사용해 보겠습니다. async도 새로운 코루틴을 실행할 수 있는데 launch와 다른 점은 Deferred<T>를 통해 결과값을 반환한다는 것입니다. 이때 지연된 결과 값을 받기 위해 await()를 사용할 수 있습니다.
...
private fun worksInParallel() {
// Deferred<T> 를 통해 결과값을 반환
val one = GlobalScope.async {
doWork1()
}
val two = GlobalScope.async {
doWork2()
}
GlobalScope.launch {
val combined = one.await() + "_" + two.await()
println("Kotlin Combined : $combined")
}
}
...
태스크들과 같이 병행 수행되므로 어떤 루틴이 먼저 종료될 지 알기 어렵습니다. 따라서 태스크가 종료되는 시점을 기다렸다가 결과를 받을 수 있도록 await()를 사용해 현재 스레드의 블로킹 없이 먼저 종료되면 결과를 가져올 수 있습니다. 여기서는 combined라는 변수에 두 개의 비동기 루틴이 종료되고 결과가 반환되면 문자를 합쳐서 할당합니다.
http://www.yes24.com
comment