728x90
반응형
이번 글에서는 전에 다루었던 withContext로 스레드를 전환 후 연산 작업을 더 빠르게 수행해보려고 한다.
기존에는 팩토리얼 계산을 Default Dispatcher를 사용해 하나의 코루틴에서 연산을 수행했다.
이번에는 여러 개의 코루틴에서 연산을 수행한다.
어떤 구조로 실행할까
- 팩토리얼을 몇개의 코루틴으로 나눠 실행할지 정해야 한다.
- 실행할 코루틴 갯수만큼 연산할 숫자의 길이를 동등하게 분배한다.
- 작은 범위를 계산하는 서브 코루틴을 동시에 실행시킨다.
- 모든 서브 코루틴이 종료되는 것을 기다린다.
- 모든 서브 코루틴이 종료되면 fold 함수를 사용해 작은 범위들을 모두 곱한다.
코드
suspend fun calculateFactorial(
factorialOf: Int,
numberOfCoroutines: Int
): BigInteger {
return withContext(defaultDispatcher) {
val subRanges = createSubRangeList(factorialOf, numberOfCoroutines)
subRanges.map { subRange ->
async {
calculateFactorialOfSubRange(subRange)
}
}.awaitAll()
.fold(BigInteger.ONE, { acc, element ->
acc.multiply(element)
})
}
}
fold 함수는 여기서 처음 보게 되었는데 값을 누적시키는 기능을 한다.
Kotlin.collections 패키지에 속해 있고 리턴 타입은 첫 파라미터로 지정한 초기값과 같다.
따라서, 여러 서브 코루틴이 종료된 후 fold 함수를 통해 각 서브 코루틴의 결과를 곱해 리턴한 것이다.
여기서 SubRange를 만드는 과정이나 각 SubRange의 팩토리얼 계산은
이번 글에서 중요한 요소가 아니므로 제외했다.
728x90
반응형
'Language > Kotlin' 카테고리의 다른 글
Java, Kotlin Interoperability 해결하기 (0) | 2024.11.18 |
---|---|
CoroutineScope와 CoroutineContext 되짚어보기 (0) | 2024.09.21 |
withContext로 스레드 전환하기 (0) | 2024.09.18 |
Coroutines Dispatcher 알아보기 (2) | 2024.09.13 |
CoroutineContext와 CoroutineScope 알아보기 (1) | 2024.09.04 |