https://seyoungcho2.github.io/CoroutinesKoreanTranslation/undefined-1.html
일시중단 함수 구성하기 · GitBook
이 섹션은 일시 중단 함수를 구성하기 위한 다양한 접근 방식을 다룬다. 일종의 원격 서비스 호출이나 계산 같은 두 유용한 일시 중단 함수들이 서로 다른 위치에 정의되어 있다고 가정해보자.
seyoungcho2.github.io
- 위 문서를 참고하여 작성했습니다.
기본적인 순차 처리
- 아래와 같은 코드를 실행하면 기본 순차적 실행으로 인해 42가 반환된다.
suspend fun doSomethingUsefulOne(): Int {
delay(1000L) // 여기서 유용한 작업을 실행한다고 가정한다.
return 13
}
suspend fun doSomethingUsefulTwo(): Int {
delay(1000L) // 여기서도 유용한 작업을 실행한다고 가정한다.
return 29
}
val time = measureTimeMillis {
val one = doSomethingUsefulOne()
val two = doSomethingUsefulTwo()
println("The answer is ${one + two}")
}
println("Completed in $time ms")
- 순차 실행으로 인해 2초 이상의 실행 시간이 소요된다.
async를 활용한 동시성
- 만약 doSomethingUsefulOne과 doSomethingUsefulTwo의 실행 사이에 종속성이 없고, 이 둘을 동시에 실행함으로써 응답을 더 빨리 얻고 싶다면 async를 사용하면 된다.
- 개념적으로 async는 launch와 같다. async는 다른 스레드들과 동시에 동작하는 별도의 경량 Thread인 Coroutine을 시작한다.
- 다른 점은 launch는 결괏값을 전달하지 않는 Job을 return 하지만, async는 나중에 결괏값을 반환할 것을 약속하는 경량이고 스레드 블로킹을 하지 않는 Future인 Deferred를 반환한다는 점이다.
- Deferred에 대해. await() 함수를 사용해 결괏값을 얻을 수 있지만, Deferred 또한 Job이라 필요할 때 취소될 수 있다.
public interface Deferred<out T> : Job
- 위 예제를 아래처럼 수정하면 2초대가 아니라 1초대의 시간이 소요된다.
val time = measureTimeMillis {
val one = async { doSomethingUsefulOne() }
val two = async { doSomethingUsefulTwo() }
println("The answer is ${one.await() + two.await()}")
}
println("Completed in $time ms")
async 지연 시작하기
- 선택적으로 첫 파라미터 값을 CoroutineStart.LAZY로 설정함으로써 async를 lazy 하게 만들 수 있다.
- 이 모드에서는 Coroutine의 결괏값이await에 의해 필요해지거나, Job의 start 함수가 실행될 때 시작된다.
[Kotlin Coroutine] async를 사용한 동시성. API 호출 결과를 합산
- 해당 문서와 번역본을 참고했습니다.https://kotlinlang.org/docs/composing-suspending-functions.html#sequential-by-default Composing suspending functions | Kotlin kotlinlang.orghttps://seyoungcho2.github.io/CoroutinesKoreanTranslation/undef
yongdragon9819.tistory.com
- 위 글에서 지연 시작과 async를 통한 api 동시 호출에 대해 확인 가능하다.