시배's Android

Kotlin Corotuine | 만개의 Coroutine을 실행하면 몇개의 스레드가 활성화 될까? 본문

Kotlin/Kotlin Coroutine

Kotlin Corotuine | 만개의 Coroutine을 실행하면 몇개의 스레드가 활성화 될까?

si8ae 2023. 7. 16. 13:29

Kotlin Coroutine과 스레드 활성화

Kotlin의 강력한 비동기 프로그래밍 도구인 Coroutine은 스레드를 효율적으로 관리하여 비동기 작업을 수행할 수 있도록 돕습니다. 이번 포스트에서는 10,000개의 Coroutine을 실행했을 때 활성화된 스레드 수를 알아보도록 하겠습니다.

import kotlinx.coroutines.*
import kotlin.system.measureTimeMillis

suspend fun createCoroutines(amount: Int) {
    val jobs = ArrayList<Job>()

    for (i in 1..amount) {
        jobs += GlobalScope.launch {
            delay(1000)
        }
    }

    jobs.forEach {
        it.join()
    }
}

fun main() = runBlocking {
    println("${Thread.activeCount()} threads active at the start")

    val time = measureTimeMillis {
        createCoroutines(10_000)
    }

    println("${Thread.activeCount()} threads active at the end")
    println("Took $time ms")
}

위의 코드는 Kotlin의 Coroutine을 사용하여 10,000개의 Coroutine을 실행하는 예제입니다. 코드를 실행하면 시작 시와 종료 시의 활성화된 스레드 수를 확인할 수 있습니다.

 

실행 결과를 보면 시작 시에는 이미 일부 스레드가 활성화되어 있음을 확인할 수 있습니다. 이는 프로그램 실행에 필요한 기본 스레드 외에도 다른 작업에 의해 활성화된 스레드가 있을 수 있기 때문입니다.

 

실행이 완료된 후에는 스레드 풀 내의 일부 스레드가 여전히 활성화되어 있을 것입니다. 이는 Coroutine이 비동기 작업을 처리하기 위해 스레드 풀을 사용하기 때문입니다.

 

이러한 동작은 Coroutine이 개별적인 실행 흐름이기 때문입니다. 스레드는 기본적으로 한 번에 하나의 코루틴만 실행할 수 있습니다. 따라서, Coroutine이 순차적으로 실행되면서 일시 중단되는 동안 다른 코루틴에게 실행을 양보합니다.

그러나 비동기 작업이나 동시성을 활용하기 위해서는 Coroutine을 다른 스레드로 이동해야 합니다. 이때 프레임워크는 디스패처(Dispatcher)라는 개념을 사용하여 코루틴의 실행을 스레드 간에 전환합니다. 디스패처는 코루틴의 실행 콘텍스트를 관리하고, 코루틴이 어떤 스레드에서 실행될지 결정하는 역할을 합니다.

 

실행 시간을 측정해본 결과, 10,000개의 Coroutine을 처리하는 데 약 1,189 ms가 소요되었습니다. 이는 Coroutine이 비동기 작업을 효율적으로 처리하고 스레드를 재사용하며, 작업 완료 시 다른 Coroutine에게 할당함으로써 동시성을 가능하게 합니다.

 

따라서, Kotlin Coroutine 기본적으로 개의 스레드에서 실행되지만, 프레임워크는 디스패처를 사용하여 코루틴의 실행을 스레드 간에 전환하여 비동기 작업을 처리합니다. 이를 통해 Coroutine 비동기 작업을 효율적으로 처리하면서 동시성을 활용할 있습니다.