Ref. ( ์๋ ์ ํ๋ธ ์์์ ๊ฐ๋ ฅ ์ถ์ฒ )
Youtube : [์์ฐจ์, ์ฝํ๋ฆฐ ์ฝ๋ฃจํด] https://youtube.com/playlist?list=PLbJr8hAHHCP5N6Lsot8SAnC28SoxwAU5A
Ref : https://kotlinlang.org/
[ ๊ฐ๋จ ์์ฝ ]
๋น๋๊ธฐ๋ ์์ฐจ์ ์ผ๋ก
์์ฐจ์ ์ด์ง ์๊ฒ ๋น๋๊ธฐ์ ์ผ๋ก - async
์ด์ค Lazy ๋งค๊ฐ ๋ณ์์ ๋ํด์๋ ์ดํด ๋ณด์๋ค.
Structured concurrency ํํ
> ์ค์ฝํ ์์์ ์ฝ๋ฃจํด์ ์คํ์ํจ๋ค๋ฉด, ํด๋น ์ฝ๋ฃจํด๋ค์ด ์๋ชป๋์์ ๋ ์บ์ฌ์ด ์ ํ ๋๋ฉด์ ๋ชจ๋ ์ฝ๋ฃจํด์ ์ข ๋ฃํ ์ ์๋ค๋ ์ ์ฃผ์!
โ๏ธ ์ฝ๋ฃจํด์ ๋น๋๊ธฐ ์ผ์ง๋ผ๋ ์์ฐจ์ ์ธ ์ฝ๋์ ๊ฐ๋ค. (์์ 08:20)
fun main() = runBlocking {
val time = measureTimeMillis {
val one = doSomethingUsefulOne()
val two = doSomethingUsefulTwo()
println("The answer is ${one+two}")
}
println("Completed in ${time} ms")
}
suspend fun doSomethingUsefulOne():Int{
// ์ค์ ๋ก ์ ์ฉํ ๋์์ ํ๋ ๋ถ๋ถ์ผ๋ก ์๋ฒ ํธ์ถ ํน์ heavy ํ ์ฐ์ฐ์ ํ๋ ๋ถ๋ถ.
delay(1000L)
return 13
}
suspend fun doSomethingUsefulTwo():Int{
delay(1000L)
return 29
}
์ฝ๋ ๊ฒฐ๊ณผ
>> 2000L ์ ๋
โ๏ธ ๋
๋ฆฝ์ ์ธ ๋๊ฐ์ง๋ฅผ ๋๋ฐฐ ๋น ๋ฅด๊ฒ ํ ์ ์๋ค. ๋ช
์์ ์ผ๋ก (async ์ฌ์ฉ) ํธ์ถํด์ผ ํ๋ค.
- await ๋ async ๋๋๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
- ์ด๋ฐ ๊ฒ์ ํตํด, ๋น๋๊ธฐ๋ก ์ฝ๋ฃจํด์ ํธ์ถํ๋ค๋์ง ๋๊ธฐ๋ก ํธ์ถํ๋ค๋์ง ์์ ์์ฌ๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ตํ๋ค.
๋๊ฐ์ ์ฐ๊ด์ด ์๋ ๊ฒ์ ์ด๋ป๊ฒ ํ ์ ์๋์ง๋ฅผ ์์๋ณด์๋ค.
(์์ฝ : async๋ฅผ ํตํด์ ํ๊ณ , deferred ๊ฐ์ฒด๊ฐ ๋ฐํ๋๊ณ await๋ฅผ ํตํด์ ํ ์ ์๋ค.)
fun main() = runBlocking {
val time = measureTimeMillis {
val one = async {doSomethingUsefulOne()}
val two = async {doSomethingUsefulTwo()}
println("The answer is ${one.await() + two.await()}")
}
kotlin.io.println("Completed in ${time} ms")
}
suspend fun doSomethingUsefulOne():Int{
// ์ค์ ๋ก ์ ์ฉํ ๋์์ ํ๋ ๋ถ๋ถ์ผ๋ก ์๋ฒ ํธ์ถ ํน์ heavy ํ ์ฐ์ฐ์ ํ๋ ๋ถ๋ถ.
delay(1000L)
return 13
}
suspend fun doSomethingUsefulTwo():Int{
delay(1000L)
return 29
}
์ฝ๋ ๊ฒฐ๊ณผ
>> 1000L ์ ๋
โ๏ธ async๋ก ์คํํ๋ ์ฝ๋ฃจํด์ ์ด๋ป๊ฒ ํ๋ฉด ๋์ค์ ์คํ ํ ์ ์๊ฒ ํ ์ ์์๊น?
async ์์ฒด๋ ์ฝ๋ฃจํด ๋น๋์ด๋ค.
async()๋ก ๋ง๋ค๋ ์์ ๋งค๊ฐ ๋ณ์ start์ Lazy๋ฅผ ๋ฃ์ด์ฃผ๊ฒ ๋๋ฉด ๋ฐ๋ก ์คํ๋์ง ์๋๋ค.
lazy๊ฐ ๋ฃ์ด์ง๋ฉด start ๋ฅผ ํด์ฃผ๊ฑฐ๋ ํน์ await๋ฅผ ํด์ค ๋ ์ด ์ฝ๋ฃจํด์ด ์คํ๋๊ฒ ๋๋ค.
.start() ๋ฅผ ์์ ๋ฉด ? 2์ด๊ฐ ๊ฑธ๋ฆผ : ์์ผ๊น.
์ฝ๋ฃจํด ํ๋ ๋ง๋ค๊ณ ๋ํ๋ ๋ง๋ค์๋๋ฐ start ํ์ง ์์์ผ๋ await ๋ฅผ ๋ง๋๊ฒ ๋๊ณ ,
one.await์์ ์คํ๋๋ฉด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์ฝ๋ฃจํด์ด ์คํ ๋๊ธฐ ๋๋ฌธ.
fun main() = runBlocking {
val time = measureTimeMillis {
val one = async(start = CoroutineStart.LAZY) {doSomethingUsefulOne()}
val two = async(start = CoroutineStart.LAZY) {doSomethingUsefulTwo()}
one.start()
two.start()
println("The answer is ${one.await() + two.await()}")
}
kotlin.io.println("Completed in ${time} ms")
}
suspend fun doSomethingUsefulOne():Int{
// ์ค์ ๋ก ์ ์ฉํ ๋์์ ํ๋ ๋ถ๋ถ์ผ๋ก ์๋ฒ ํธ์ถ ํน์ heavy ํ ์ฐ์ฐ์ ํ๋ ๋ถ๋ถ.
delay(1000L)
return 13
}
suspend fun doSomethingUsefulTwo():Int{
delay(1000L)
return 29
}
โ๏ธ Structured Concurrency with async
Global Scope ์์ Launch ํ๋ ํํ๋ก ํจ์๋ฅผ ๊ฐ์ธ์ ๋ง๋ค์ง ๋ง๊ณ ,
Structured concurency ํํ๋ก suspend ํจ์๋ฅผ ์กฐํฉํ๊ณ , ์ฝ๋ฃจํด์ ๊ตฌ์ฑ ํ๋๊ฒ ๋ฎ๋ค.
fun main() = runBlocking {
val time = measureTimeMillis {
println("The answer is ${concurrentSum()}")
}
println("Completed in ${time} ms")
}
suspend fun concurrentSum():Int = coroutineScope {
val one = async { doSomethingUsefulOne() }
val two = async { doSomethingUsefulTwo() }
delay(10)
println("exception")
// throw Exception()
one.await() + two.await()
}
suspend fun doSomethingUsefulOne():Int{
println("start, doSomethingUsefulOne")
delay(3000L) // ์์ exception ์ผ๋ก cancel ์ ์ด delay์์
println("end,doSomethingUsefulOne ")
return 13
}
suspend fun doSomethingUsefulTwo():Int{
kotlin.io.println("start, doSomethingUsefulTwo")
delay(3000L)
kotlin.io.println("end,doSomethingUsefulTwo ")
return 29
}
โ๏ธ Structured Concurrency ์์์ ์คํ๋ async ์ฝ๋ฃจํด 2๊ฐ๊ฐ ์๋๋ฐ,
์ด๋ค ์ฝ๋ฃจํด์์ Exception ์ด ๋ฐ์ํ์ ๋, Exception์ด ๋ฐ์๋์ด์ ์ฝ๋ฃจํด์ด Cancel ๋๋ฉด Cancel ๋ ๊ฒ๋ค์ด Hierarchy๋ก ์ ํ๋๋ค.
fun main() = runBlocking<Unit> {
try{
failedConcurrentSum()
}catch (e: ArithmeticException){
println("Computation failed with ArithmeticException")
}
}
// ์ฝ๋ฃจํด two ์์ exception์ด ๋ฐ์ํ๋ฉด ๋ค๋ฅธ ์ฝ๋ฃจํด one์ try~ catch~๊ฐ๋์ finally~ ๋ธ๋ก์ด ์ฐํ๊ฒ ๋๋ค.
// ์ฆ ์ ๋ฆฌํ์๋ฉด, ๋ ๊ฐ์ ๋ค๋ฅธ ์ฝ๋ฃจํด์ด ์์๋๋ฐ ์ต์๊ฐ ์ ํ๋ ๊ฒ!
// and, ์ด๊ฒ์ ๋ถ๋ฌ์ค ๋ถ๋ชจ ์ฝ๋ฃจํด์ด ์๋๋ฐ, ์ด ์ฝ๋ฃจํด ๋ด์์ (์์ runBlocking) ์ทจ์๊ฐ ์ ํ๊ฐ ๋์ด์ ๋ค์ try~ catch~ ๋์ด์ ์กํ๊ฒ ๋๋ค.
suspend fun failedConcurrentSum():Int = coroutineScope {
val one = async<Int>{
try{
delay(Long.MAX_VALUE)
42
}finally {
println("First child was cancelled")
}
}
val two = async<Int> {
println("Second child throws an exception")
throw java.lang.ArithmeticException()
}
one.await() + two.await()
}
'Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[2] Kotiln Coroutines - Cancelation / TimeOut (0) | 2021.07.26 |
---|---|
[1] Kotiln Coroutines - Coroutine Builder/Scope/Suspend function/Structured Concurrency (0) | 2021.07.23 |
Kotlin : Repeat / Git Overide r-- r-- r-- ํด๊ฒฐ (0) | 2021.07.23 |
[๋ฏธ์ Kotlin_Android] MVVM ํจํด (0) | 2021.07.19 |
IntelliJ ์ค์น ์ ์ปดํ์ผ ์ค๋ฅ (0) | 2021.07.19 |
๋๊ธ