반응형
지난 시간에는 코루틴이 무엇인지? launch 를 사용한 동시처리, 병렬처리
그리고 delay, sleep 의 차이를 예를 들어 context, dispatcher 까지 폭넓게 살펴봤다.
이번에는 비동기 처리 (async) 를 어떻게 하는지 짧게 살펴보도록 하겠다.
suspend fun parallelAsync_multiple() = coroutineScope {
val a1: Deferred<String> = async {
delay(1000)
"job1"
}
val a2: Deferred<String> = async {
delay(1000)
"job2"
}
println("print same time: ${a1.await()}")
println("print same time: ${a2.await()}")
}
/**
print same time: job1
print same time: job2
**/
코루틴 관련 내용을 걷어내고 보면 마치 동기 코드를 짜는것 같다. 위 코드는 총 2초가 걸리지 않고 코루틴으로 돌아가기 때문에 1초밖에 안걸린다.
async 함수
launch 와 달리 async 라는 함수를 사용하여 코루틴을 만들고 있다.
async 는 launch 와 같이 코루틴 빌더이며, suspend 함수가 아니다.
(코루틴 안에서 suspend 함수를 만났을때 제어권이 넘어간다는 것이지 코루틴은 suspend 함수가 아니다.)
그리고 launch 와 달리 async 블록 안에 있는 값 타입을 감싼 Deferred<T> 형태로 응답한다.
코드를 이어 가려면 언젠가는 값을 받아와야 하는데, Deferred의 await() 함수를 사용한다.
async 코루틴의 응답 타입이 같다면 awaitAll() 을 사용해서 한번에 값을 받아올 수도 있다.
suspend fun parallelAsync_list() = coroutineScope {
val deferedList: List<Deferred<String>> = (1..10).map {
async {
delay(1000)
"job$it"
}
}
println("print after 1 second: ${awaitAll(*deferedList.toTypedArray())}")
}
/**
print after 1 second: [job1, job2, job3, job4, job5, job6, job7, job8, job9, job10]
**/
반응형
'코틀린' 카테고리의 다른 글
코루틴을 사용한 안전한 예외처리 - 2 (0) | 2022.01.14 |
---|---|
코루틴을 사용한 안전한 예외처리 - 1 (0) | 2022.01.14 |
코루틴을 사용한 동시성, 병렬처리 - 1 (2) | 2022.01.14 |
QueryDsl 코틀린으로 안전하게 쓰기 (0) | 2022.01.11 |
Kotlin Exposed (orm) 사용해보기 (0) | 2022.01.09 |
댓글