PHpullh
학습 라이브러리/Kotlin/스레드 풀 최적화

KOTLIN · 성능

스레드 풀 최적화

코루틴 디스패처와 스레드 풀 설정을 최적화합니다. CPU 바운드와 I/O 바운드 작업의 구분이 핵심입니다.

성능고급thread-pooldispatcherslimitedParallelismconcurrency

핵심 설명

코루틴 디스패처와 스레드 풀 설정을 최적화합니다. CPU 바운드와 I/O 바운드 작업의 구분이 핵심입니다.

Kotlin code

import kotlinx.coroutines.*
import java.util.concurrent.Executors
import kotlin.system.measureTimeMillis

fun main() = runBlocking {
    // CPU 바운드: Dispatchers.Default (코어 수 만큼)
    println("Default 스레드: ${Runtime.getRuntime().availableProcessors()}")

    // I/O 바운드: Dispatchers.IO (최대 64 스레드)
    val ioTime = measureTimeMillis {
        val jobs = List(100) {
            async(Dispatchers.IO) {
                Thread.sleep(100) // I/O 시뮬레이션
                "결과-$it"
            }
        }
        jobs.awaitAll()
    }
    println("IO 100개 병렬: ${ioTime}ms")

    // 커스텀 디스패처
    val customPool = Executors.newFixedThreadPool(4).asCoroutineDispatcher()
    val customTime = measureTimeMillis {
        val jobs = List(20) {
            async(customPool) {
                Thread.sleep(50)
                it
            }
        }
        jobs.awaitAll()
    }
    println("커스텀(4스레드) 20개: ${customTime}ms")
    customPool.close()

    // limitedParallelism: 기존 디스패처에서 동시성 제한
    val limited = Dispatchers.IO.limitedParallelism(2)
    val limitedTime = measureTimeMillis {
        val jobs = List(10) {
            async(limited) {
                Thread.sleep(100)
                it
            }
        }
        jobs.awaitAll()
    }
    println("제한(2스레드) 10개: ${limitedTime}ms")
}

학습 팁

Dispatchers.IO.limitedParallelism(n)은 전체 IO 풀과 스레드를 공유하면서 동시 실행 수만 제한합니다. DB 연결 풀 크기에 맞출 때 유용합니다.

주의할 점

CPU 바운드 작업에 Dispatchers.IO를 사용하면 스레드가 과다 생성되어 컨텍스트 스위칭 오버헤드가 발생합니다. CPU 작업에는 Default를 사용하세요.

자주 묻는 질문

스레드 풀 최적화란 무엇인가요?

코루틴 디스패처와 스레드 풀 설정을 최적화합니다. CPU 바운드와 I/O 바운드 작업의 구분이 핵심입니다.

스레드 풀 최적화 학습 시 주의할 점은 무엇인가요?

CPU 바운드 작업에 Dispatchers.IO 를 사용하면 스레드가 과다 생성되어 컨텍스트 스위칭 오버헤드가 발생합니다. CPU 작업에는 Default 를 사용하세요.