코틀린 코루틴을 사용해 동시성을 구현하는 방법에 대해서 다루겠습니다.
핵심은 async builder를 사용해 작업을 실행하고, await를 사용해서 async에서 작업이 끝날 때까지 기다리고 결과물을 가져오는 것입니다.
예를 들어 동시성이 아닌 순차적으로 프로그래밍이 진행된다고 생각해보자
A 작업이 완료되는 시간 ⇒ 10초
B 작업이 완료되는 시간 ⇒ 8초
A, B 순차적으로 실행하면 총 18초가 걸립니다.
하지만 A, B 작업을 평행하게 작업하면 10초가 걸립니다.
A, B 각각 평행하게 작업하고 그 결과 값들을 결합하는 작업을 할 것입니다.
작업은 다음과 같이 2가지가 있습니다.
하나는 10초, 다른 하나는 8초가 걸립니다.
먼저 두 작업을 순차적으로 진행하고, 동시적으로 작업하도록 해보겠습니다.
private suspend fun getStock1() : Int {
delay(10000)
Log.i("MyTag"," stock 1 returned ")
return 55000
}
private suspend fun getStock2() : Int {
delay(8000)
Log.i("MyTag"," stock 2 returned ")
return 35000
}
순차적으로 수행한 경우
1번 작업 이후에 2번 작업을 하고 나서 각각 반환 값을 더하도록 했습니다.
CoroutineScope(Main).launch {
Log.i("MyTag","Calculation started....")
val stock1 =getStock1()
val stock2 =getStock2()
val total = stock1+stock2
Log.i("MyTag", "Total is $total ")
}
로그를 확인하면 다음과 같이
1번 작업 끝내는데 10초 (24 -> 34) 걸리고, 이후 2번 작업 끝내는데 8초 걸려 총 18초 정도 걸린 것을 알 수 있습니다.
2021-02-17 23:13:24.143 22831-22831/com.keepseung.asyncawaitdemo I/MyTag: Calculation started....
2021-02-17 23:13:34.159 22831-22831/com.keepseung.asyncawaitdemo I/MyTag: stock 1 returned
2021-02-17 23:13:42.171 22831-22831/com.keepseung.asyncawaitdemo I/MyTag: stock 2 returned
2021-02-17 23:13:42.171 22831-22831/com.keepseung.asyncawaitdemo I/MyTag: Total is 90000
동시적으로 수행한 경우
async() Builder를 사용했고, Dispacher.IO Context를 사용해 1번, 2번 작업을 각각 별도의 백그라운드 스레드에서 작업하도록 했습니다.
또한 각각 코루틴 작업을 끝낼 때까지 기다리고 반환 값을 받도록 await() suspending 함수를 사용했습니다.
CoroutineScope(Main).launch {
Log.i("MyTag","Calculation started....")
val stock1 = async(IO) {
getStock1()
}
val stock2 = async(IO) {
getStock2()
}
val total = stock1.await()+stock2.await()
Log.i("MyTag", "Total is $total ")
}
코드 순서상으로는 1번이 2번 작업보다 먼저 실행되도록 선언되어 있지만 2번(8초)이 1번(10초)보다 먼저 작업이 끝나므로 2번 작업 끝나는 로그가 먼저 찍힌 것을 확인할 수 있습니다.
이후 1번 작업 끝나는게 확인되고 1,2번 작업을 모두 끝내는데 총 10초가 걸린 것을 알 수 있습니다.
2021-02-17 23:16:47.355 22953-22953/com.keepseung.asyncawaitdemo I/MyTag: Calculation started....
2021-02-17 23:16:55.403 22953-23012/com.keepseung.asyncawaitdemo I/MyTag: stock 2 returned
2021-02-17 23:16:57.400 22953-23012/com.keepseung.asyncawaitdemo I/MyTag: stock 1 returned
2021-02-17 23:16:57.402 22953-22953/com.keepseung.asyncawaitdemo I/MyTag: Total is 90000
'Language > Kotlin' 카테고리의 다른 글
코틀린[Kotlin] 기본 문법 2 (클래스, 제너릭, 상속) (0) | 2021.09.22 |
---|---|
코틀린[Kotlin] 기본 문법 1 (함수, 변수, 널 안전성) (0) | 2021.09.22 |
Kotlin Coroutine Thread 변경하기, Coroutine Suspending Functions (중단 함수) (0) | 2021.02.17 |
Kotlin Coroutine Scope, Context, Dispacher에 대해서 (0) | 2021.02.17 |
Kotlin Coroutine 소개 및 Hello Coroutine! (0) | 2021.02.17 |