- 코틀린 코루틴 라이브러리가 제공하는 중요한 기능은 코루틴이 실행되어야(시작 or 재개)할 스레드(스레드풀)를 결정할 수 있음.
- 디스패처를 이용해 위 기능을 사용할 수 있음.
- 코틀린 코루틴에서 코루틴이 어떤 스레드에서 실행 될지 정하는 것은
CoroutineContext
임
기본 디스패처
- 디스패처를 설정하지 않으면 기본적으로 설정되는 디스패처는
Dispatchers.Default
임.
- 이는 CPU 집약적인 연산을 수행하도록 설계되어있음.
Dispatchers.Default
는 코드가 실행되는 컴퓨터의 CPU 개수와 동일한 수(최소 두 개 이상)의 스레드 풀을 가지고 있음.
기본 디스패처를 제한하기
- 비용이 많이 드는 작업이
Dispatchers.Default
의 스레드를 다 써서 디스패처를 사용하는 다른 코루틴이 실행될 기회를 제한하고 있는 경우엔 Dispatchers.Default
의 limitedParallelism
을 사용하면 디스패처가 같은 스레드 풀을 사용하지만, 같은 시간에 특정 수 이상의 스레드를 사용하지 못하도록 제한할 수 있음.
private val dispatcher = Dispatchers.Default.limitedParallelism(5)
- 위 코드는 디스패처의 스레드 수를 제한하는 방법임.
메인 디스패처
- 메인 스레드에서 코루틴을 실행하려면
Dispatchers.Main
을 사용하면 됨.
- 안드로이드에서는 기본 디스패처로 메인 디스패처를 주로 사용함.
- 기본 디스패처를 블로킹하면 스레드 풀에 있는 모든 스레드를 블로킹해서 아무런 연산도 수행할 수 없는 상황이 벌어질 수 있음.
- Dispatchers.IO는 위 상황에서 필요한 디스패처임.
IO 디스패처
- 파일을 읽고 쓰는 경우,
SharedPreference
, Room
, Retrofit
, 블로킹 함수
를 호출하는 경우처럼 I/O 연산으로 스레드를 블로킹할 때 사용하기 위해 설계되었음.
Dispatchers.IO
는 64개(또는 더 많이 있다면 해당 코어의 수)로 제한됨.
suspend fun main() {
val time = measureTimeMillis {
coroutineScope {
repeat(50) {
launch(Dispatchers.IO) {
Thread.sleep(1000)
}
}
}
}
println(time)
}
- 위 코드의 실행 결과는 1초밖에 걸리지 않음.
- 같은 시간에 50개가 넘는 스레드를 사용하기 때문임.
Dispatchers.Default
와 Dispatchers.IO
는 같은 스레드 풀을 공유함.