Android/Coroutine
Android Coroutine - CoroutineContext
강태종
2022. 1. 7. 22:34
CoroutineContext
CoroutineContext는 Coroutine이 어떠한 환경(Thread)에서 실행될지 결정하는 중요한 매개체입니다. CoroutineScope를 만들거나 CoroutineBuilder로 새로운 Coroutine을 만들 때 주로 쓰입니다. 즉 Coroutine Context를 통해 어떠한 Thread로 Dispatch될지 결정합니다.
Thread Pool
직접 Thread Pool을 만들고 해당 Thread Pool에서 작동하는 Dispatcher를 만들 수 있습니다. (Dispatcher는 CoroutineContext를 상속받습니다.)
val dispatcher = newFixedThreadPoolContext(10, "New Fixed Thread")
CoroutineScope(dispatcher).launch {
...
}
val dispatcher = newSingleThreadContext("New Single Thread")
CoroutineScope(dispatcher).launch {
...
}
Dispatchers
기본적으로 Dispathcers라는 object에 Default, Main, IO, Unconfined가 정의되어 있으며 해당 Dispathcer는 Thread Pool을 가지고 있습니다.
- Default : 기본적으로 CPU 자원을 많이 소비하는 작업에 최적화된 Dispatcher
- Main : Android Main Thread에서 Coroutine이 실행되도록 도와주는 Dispatcher ANR을 막기 위해 UI 관련된 필요한 작업만 진행하는 것이 좋다.
- IO : Disk, Network 등 IO 작업에 최적화된 Dispatcher
- Unconfined : 현재 Thread에 맞게 실행되는 신기한 Dispatcher, 실행 당시 Thread에서 실행되다가 suspend후 resume될 때 Thread에서 이어서 작업을 진행한다.
EmptyCoroutineContext
종종 Coroutine 내부 코드를 보면 볼 수 있는 Context이다. Empty 즉 아무것도 없는 상태를 뜻한다. (Coroutine 내부 구조에서 Context가 존재하지 않으면 Dispatchers.Deafult로 진행한다.)