코루틴(Coroutine)

구교석·2024년 4월 3일
post-thumbnail

코루틴(Coroutine)이란?

코루틴의 영어 그대로 뜻을 살펴보면 코루틴은 Co(함께, 서로) + routine(규칙적 일의 순서, 작업의 집합) 2개가 합쳐진 단어로 함께 동작하며 규칙이 있는 일의 순서를 뜻합니다.
코루틴의 이름 때문에 코틀린과 연관있다고 생각하실 수도 있지만 코루틴은 1958년 코루틴 용어가 만들어지고 난 후 어셈블리 프로그램에서부터 적용되었던 개념입니다.
C#, Javascript, Python, Go와 같은 고급 프로그래밍 언어에서도 지원하고 있으며 Javascript의 async/await 기술을 사용하고 있다면 더욱 친숙하게 코틀린을 느끼실 수도 있습니다.
하지만 이번에는 코틀린을 중심으로 보겠다.

코루틴의 정의

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

비선점적 멀티태스킹이란?

비선점형 : 하나의 프로세스가 CPU를 할당받으면 종료되기 전까지 다른 프로세스가 CPU를 강제로 차지할 수 없습니다. (코루틴)
선점형 : 하나의 프로세스가 다른 프로세스 대신에 프로세서(CPU)를 강제로 차지할 수 있습니다. (쓰레드)

결국 코루틴은 실행이 마지막으로 중단되었던 지점의 바로 다음장소에서 실행을 재개한다고 볼 수 있습니다.

코루틴의 특징은 이 일직선적인 흐름을 중간에 지연시켰다가(suspend) 다시 재시작(resume)이 가능하다.

따라서 코루틴을 사용하면 루틴이 실행 되었더라도 더 바쁜 다른 루틴이 실행되는 동안 잠시 멈췄다가, 바쁜게 끝나면 재시작하여 나머지 작업을 끝내는 형태의 비동기 프로그래밍이 가능하게 된다.

또 코루틴은 자기 스스로가 메인루틴이 되면서도 서브루틴이 될 수 있다는 특징도 있다.

코루틴 코드

fun main() = runBlocking { // this: CoroutineScope
    launch { // launch a new coroutine and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World!") // print after delay
    }
    println("Hello") // main coroutine continues while a previous one is delayed
}

launch { ... }

launch 는 코루틴 빌더로 나머지 코드와 동시 실행을 위해 새로운 코루틴을 생성하며 작업을 독립적으로 진행한다.
떄문에 Hello가 먼저 출력되었다.

delay()

delay 는 특별한 일시 정지 기능으로, 특정 시간동안 코루틴을 일시정지 시킨다.
코루틴을 일시 중단하면 기본 스레드가 차단되지 않지만, 다른 코루틴이 코드를 위해 기본 스레드를 실행하고 사용할 수 있다.

runBlocking { ... }

runBlocking 도 코루틴 빌더로 fun main()의 코루틴이 아닌 영역과 runBlocking 중괄호 내의 코루틴 코드를 연결한다. 
IDE는 this: CoroutineScope라는 힌트로 하이라이트 표시된다.

애플리케이션의 최상위 레벨에서 이와 같이 사용되는 runBlocking을 종종 볼 수 있고, 실제 코드 내부에서는 거의 볼 수 없다.
스레드는 고가의 리소스이고 스레드를 차단하는 것이 비효율적이며, 종종 바람직하지 않기 때문이다.

참고 사이트


[kotlin] 코틀린의 코루틴 가이드(1)
Kotlin, 코루틴 제대로 이해하기 - (1)
코루틴(Coroutine)에 대하여

profile
끊임없이 노력하는 개발자

0개의 댓글