이번 글은 저번 CoroutineContext와 CoroutineScope를 소개한 것에 이어서 Dispatcher에 대해 알아보겠다.
Dispatcher의 역할
Dispatcher는 해당 코루틴이 어느 스레드나 스레드 풀에서 실행될지 결정한다.
Dispatcher의 종류
Dispatcher는 이미 정의된 몇가지가 있는데 이에 대해 짧막하게 알아보자.
Dispatchers.Main
Main Dispatcher는 오직 UI가 있는 애플리케이션에서만 사용할 수 있다.
안드로이드의 경우, UI 작업을 오직 메인 스레드에서만 허용하므로
Main Dispatcher를 사용해 메인 스레드에서 실행할 수 있다.
해당 Dispatcher가 Main Looper와 연결된 Handler를 사용하기 때문이다.
우리가 Main Dispatcher를 사용해 특정 코드를 실행하게 되면
이를 Runnable 형식으로 메인 스레드 메시지 큐에 전달하게 된다.
반면에, 코틀린을 백엔드에서 사용하는 경우 이 Dispatcher는 찾을 수 없을 것이다.
Dispatchers.IO
IO Disptcher는 주로 네트워크나 디스크에서 데이터를 가져올 때 사용한다.
내부적으로 공유된 스레드풀을 사용하며 64개로 제한되어 있다.
하지만, 설정에 따라 한도를 늘릴 수도 있다.
Dispatchers.Default
Default dispatcher는 이름대로 launch와 async같은
Coroutine builder의 기본 Dispatcher로 사용된다.
Context에서 다른 Dispatcher가 명시되지 않은 경우,
CPU 집약적인 작업에 최적화되어있다.
예를 들면, 무거운 계산을 하거나 사이즈가 큰 리스트를 정렬하고,
큰 사이즈의 파일을 파싱하는 작업이 있다.
이 dispatcher 또한 IO Dispatcher처럼 공유된 스레드풀을 사용하는데,
스레드의 최댓수가 디바이스의 CPU 코어 수와 같다.
Dispatchers.Unconfined
이 dispatcher는 이름대로 특정 스레드에 국한되지 않는다.
따라서 코루틴을 실행한 스레드의 소유가 된다.
신기한 점이 하나 있는데 내가 듣고 있는 강의에서는
공식 문서에서 되도록 사용하지 말라는 내용을 적어두었다고 했다.
하지만, 지금은 공식 문서에서 찾아볼 수가 없다.
이전 글에서 문제점 수정 예고
https://bonustrack02.tistory.com/entry/Coroutines-on-Main-Thread위험성에-대해-인지하기
위 글에서 무거운 연산을 Main Thread에서 수행해보았다.
이제 다음 글에서 해당 연산을 다른 스레드에서 실행할 수 있도록 바꿔보도록 하겠다.
'Language > Kotlin' 카테고리의 다른 글
CoroutineScope와 CoroutineContext 되짚어보기 (0) | 2024.09.21 |
---|---|
withContext로 스레드 전환하기 (0) | 2024.09.18 |
CoroutineContext와 CoroutineScope 알아보기 (1) | 2024.09.04 |
Coroutines on Main Thread(위험성에 대해 인지하기) (0) | 2024.09.03 |
Extract retry logic into higher order function from previous Coroutine (0) | 2024.08.25 |