Coroutine

image.png

<aside> <img src="/icons/info-alternate_blue.svg" alt="/icons/info-alternate_blue.svg" width="40px" />

Co(함께, 서로) + Routine(규칙적 일의 순서, 작업의 집합)

즉, 함께 동작하며 규칙이 있는 일의 순서를 뜻함

</aside>

실행의 지연과 재개를 허용함으로 써, 비선점적 멀티태스킹을 위한 서브 루틴을 일반화 한 컴퓨터 프로그램 구성 요소 - 위키디피아 -

Subroutine 과 Coroutine

image.png

image.png

Subroutine

Coroutine

선점형/비선점형

선점형 사진 - velog.io/@zero_mountain

선점형 사진 - velog.io/@zero_mountain

비선점형 사진 - velog.io/@zero_mountain

비선점형 사진 - velog.io/@zero_mountain

비선점형 코틀린 예시 코드

// 비선점형 
import kotlinx.coroutines.*

fun main() =
    runBlocking {
        // 공부 시작 (asyncStartStudy)
        val job1 = launch {
            asyncStartStudy()
        }
        job1.join() // 끝날 때까지 기다림 (협력적 스케줄링)

        // 한맥 시작
        startHanmac()

        // 발표 시작
        launch {
            asyncDoPresentation { speakingHong() }
        }.join()
    }

suspend fun asyncStartStudy() {
    println("공부 시작 - ${Thread.currentThread().name}")
    delay(100) // 협력적 전환 포인트
    println("공부 끝 - ${Thread.currentThread().name}")
}

suspend fun startHanmac() {
    println("한맥 시작 - ${Thread.currentThread().name}")
    delay(50)
}

suspend fun asyncDoPresentation(block: suspend () -> Unit) {
    println("발표 시작 - ${Thread.currentThread().name}")
    block()
    println("발표 끝 - ${Thread.currentThread().name}")
}

suspend fun speakingHong() {
    println("hong 말하는 중 - ${Thread.currentThread().name}")
    delay(50)
}