왜 코루틴은 경량 쓰레드로 불릴까?
왜 코루틴은 경량 쓰레드 라고 불릴까?
일단 간략하게 코루틴에 대해서 알아보자면 코루틴은 쓰레드가 아니고 쓰레드 안에서 동작하는 하나의 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가 발생할 수 있다.
Author And Source
이 문제에 관하여(왜 코루틴은 경량 쓰레드로 불릴까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kjy0302014/왜-코틀린은-경량-쓰레드로-불릴까저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)