๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Kotlin

[1] Kotiln Coroutines - Coroutine Builder/Scope/Suspend function/Structured Concurrency

by ๋„์บ๋ฆฌ๐Ÿฑ 2021. 7. 23.
๋ฐ˜์‘ํ˜•

Why Coroutine?

https://wooooooak.github.io/kotlin/2019/08/25/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%BD%94%EB%A3%A8%ED%8B%B4-%EA%B0%9C%EB%85%90-%EC%9D%B5%ED%9E%88%EA%B8%B0/

 

Ref.

Youtube :  [์ƒˆ์ฐจ์›, ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋ฃจํ‹ด] https://youtube.com/playlist?list=PLbJr8hAHHCP5N6Lsot8SAnC28SoxwAU5A

Ref : https://kotlinlang.org/

 

[ ์ค‘์š”ํ•œ ๊ฐœ๋… ]
* Coroutine Builder → [launch] , [runBlocking]
* Scope → [CoroutineScope] , [GlobalScope]
* Suspend function → [suspend] , [delay()], [join()]
* Structured Concurrency

 

 

 

[↓์˜ˆ์ œ ] Coroutine๊ณผ Job ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์˜ˆ์ œ

 

    runBlocking {
        GlobalScope.launch {
            delay(3000L) // ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์•„๋ž˜ 2์ดˆ ํ›„ ์ข…๋ฃŒ, ์ฝ”๋ฃจํ‹ด์€ 3์ดˆ ํ›„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๊ฑฐ๋‹ˆ ์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ๋จ.
            println("World!")
        }
        println("Hello,")
        delay(2000L)
    }

 

    val job = GlobalScope.launch {
        delay(3000L)
        println("World!")
    }

    println("Hello")
    job.join() // join์„ ํ†ตํ•ด job ์ด ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋จ.

 

    // Structured concurrency : 
    // ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด sleep ์ด๋‚˜ job.join()์„ ํ–ˆ๋Š”๋ฐ ์ด๊ฒƒ๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค! ๋ฐ”๋กœ!
    fun main() = runBlocking {
        // val job = GlobalScope → this ( GlobalScope ์—์„œ Coroutine Scope๋กœ)
        this.launch {
            delay(1000L)
            println("World!")
        }

        // this ์ƒ๋žต ๊ฐ€๋Šฅ - ๋žŒ๋‹ค ์•ˆ์ชฝ์— this ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
        launch {
            delay(1000L)
            println("World!")
         }


        println("Hello,")
   
   
   // job.join() // ์ด๋Ÿฐ์‹์œผ๋กœ ๊ด€๋ฆฌ ํ•ด์ค€๋‹ค๋ฉด, job.join() , job1.join(), job2.join() ์ด๋Ÿฐ ์‹์œผ๋กœ ์“ฐ๋ฉด ๋ณต์žกํ•ด์ง„๋‹ค. ์ด๋Ÿฐ๊ฑฐ ๋ฐฉ์ง€ ์œ„ํ•จ.

    // runBlocking ๊ณผ launch ์ฝ”๋ฃจํ‹ด์ด ๊ตฌ์กฐ์ ์œผ๋กœ ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š”๋‹ค๋ฉด, ์„œ๋กœ ๊ธฐ๋‹ค๋ ค์ฃผ๊ณ  ์‚ด ์ˆ˜ ์žˆ์ง€ ์•Š๊ฒ ๋Š”๊ฐ€!
    // >> ํƒ‘๋ ˆ๋ฒจ ์ฝ”๋ฃจํ‹ด์„ ๋งŒ๋“ค์ง€ ๋ง๊ณ , ํ•ด๋‹น ๋ฃจํ‹ด์˜ ์ฐจ์ผ๋“œ๋กœ ์ฝ”๋ฃจํ‹ด์„ ๋งŒ๋“ค๋ฉด, 
    // ์ƒ์œ„ ๋ถ€๋ชจ ์ฝ”๋ฃจํ‹ด์ด ์ฐจ์ผ๋“œ ์ฝ”๋ฃจํ‹ด ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์ฃผ๋Š”
    // ๊ตฌ์กฐ์ ์ธ ํ˜•ํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด๋ผ~

}

 

 

 

[↓์˜ˆ์ œ ] Structured Concurrency๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ฝ”๋ฃจํ‹ด ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ ๋‹ค.

fun main() = runBlocking {
                launch {
                    repeat(5){
                        i -> println("์ฝ”๋ฃจํ‹ด A ${i}")
            delay(10L) // suspend function ์ธ delay๋ฅผ ์ฃผ๋ฉด 
            // ์˜†์— ์ผ์‹œ ์ค‘๋‹จ ํ‘œ์‹œ๊ฐ€ ๋จ (์ฝ”๋ฃจํ‹ด B์— ์ค‘๋‹จ ํ•จ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด B๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๊ณ  A ๋กœ ๋Œ์•„์˜ด)
        }
    }

    launch {
        repeat(5){
            i->println("์ฝ”๋ฃจํ‹ด B ${i}")
            delay(10L)
        }
    }

    println("Coroutine Outer")
}

// ์–ด๋–ค ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰์ด ๋˜์—ˆ๋Š”์ง€ print ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ
fun <T>println(msg: T){
    kotlin.io.println("$msg [ ${Thread.currentThread().name} ]")
}

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

Coroutine Outer [ main ]
์ฝ”๋ฃจํ‹ด A 0 [ main ]
์ฝ”๋ฃจํ‹ด B 0 [ main ]
์ฝ”๋ฃจํ‹ด A 1 [ main ]
์ฝ”๋ฃจํ‹ด B 1 [ main ]
์ฝ”๋ฃจํ‹ด A 2 [ main ]
์ฝ”๋ฃจํ‹ด B 2 [ main ]
์ฝ”๋ฃจํ‹ด A 3 [ main ]
์ฝ”๋ฃจํ‹ด B 3 [ main ]
์ฝ”๋ฃจํ‹ด A 4 [ main ]
์ฝ”๋ฃจํ‹ด B 4 [ main ]

 

 


 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€