왜 코루틴은 경량 쓰레드로 불릴까?

Jaeyoung·2021년 12월 4일
0

왜 코루틴은 경량 쓰레드 라고 불릴까?

일단 간략하게 코루틴에 대해서 알아보자면 코루틴은 쓰레드가 아니고 쓰레드 안에서 동작하는 하나의 work 단위이다. 또한 여러개의 코루틴을 하나의 특정 쓰레드에서 동작시킬 수 는 있으나 코루틴을 동시에 실행하는것은 불가능 하다. 그 이유는 중단지점(suspension point)에 도달하자 마자 대기중인 다른 코루틴을 선택하여 동작하기 때문이다. 이렇게 동작하기 때문에 쓰레드와 메모리사용이 줄어들어 그 만큼 더 많은 동시성 작업을 수행할 수 있다 이 때문에 코루틴은 경량 쓰레드라고 불린다.

한 예를 들어서 1초마다 동작중이라는 문구를 print하는 작업을 thread와 coroutine 생성해서 1000번 반복하는 로직을 작성해서 thread가 얼마나 생성되는지 한번 비교해보자

fun main() = runBlocking {
    val threads = mutableListOf<Thread>()
    println("처음 : ${Thread.activeCount()}")
    repeat(1000) {
        threads += Thread {
            Thread.sleep(1000)
        }.also {
            it.start()
        }
    }
    println("끝 : ${Thread.activeCount()}")
}

먼저 쓰레드를 생성해서 동작하는 코드의 실행 결과를 보자

처음 : 2

끝 : 1002

이렇게 1000번 반복한 만큼 쓰레드가 생성이 되었다. 이번엔 coroutine에서의 실행 결과를 한번 봐보자

fun main() = runBlocking {
    val jobs = mutableListOf<Job>()
    println("처음 : ${Thread.activeCount()}")
    repeat(1000) {
        jobs += launch {
            delay(1000)
        }
    }
    println("끝 : ${Thread.activeCount()}")
}

처음 : 2

끝 : 2

쓰레드의 수가 2개로 처음이랑 같은 갯수이다 이만큼 메모리 차이가 엄청나다. 그렇기떄문에 coroutine에서 동작하는 코드가 Thread를 직접생성하는 코드로 동작했을때 OutOfMemory가 발생할 수 있다.

profile
Programmer

0개의 댓글