작성에 앞서...
현재 코틀린 코루틴의 정석 - 조세영 지음 서적을 2회독하고 있다 (최소 3회독 목표)
1회는 가볍게 전체적으로 훑었고 2회는 헷갈리는 부분을 다시 한번 짚고 나가기 위해 또 기억력이 좋지 않은 편이라 반복을 통해 기억하기 위해 복습하고 있다
기본적으로 코루틴 디스패처를 검색하면 많은 블로그에 설명이 나와있지만 책을 읽은 뒤 내가 이해하기 쉽게 간략하게 정리해보려고 작성한다.
내용은 코틀린 코루틴의 정석 - 조세영 지음을 참고하여 작성하였습니다.
코루틴에 대해 어려움을 겪고 있다면 해당 서적을 적극 추천합니다.
코루틴이 눈에 보이지 않아 설명으로 이해하기 어려운데 해당 서적은 그림으로 표현하여 이해하기 쉽게 설명하고 있습니다.
광고 아님...
CoroutineDispatcher란?
코루틴의 실행을 관리하는 주체로 자신에게 실행 요청된 코루틴을 작업 대기열에 적재해두고 사용 가능한 스레드로 옮겨 실행시키는 역할을 하는 게 코루틴 디스패처이다.
코루틴 디스패처는 제한된 디스패처와 무제한 디스패처로 나뉜다.
보통 제한된 디스패처를 많이 사용한다.
제한된 디스패처로는 단일 스레드 디스패처와 멀티 스레드 디스패처가 있다.
단일 스레드 디스패처 만들기
단일 스레드 디스패처는 코루틴 라이브러리에서 제공하는 newSingleThreadContext 함수를 사용해 만든다.
이 함수는 문자열 타입의 name을 인자로 받으며, name은 디스패처에서 관리하는 스레드의 이름이 된다.
반환 타입은 CoroutineDispatcher이다.
val dispatcher: CoroutineDispatcher = newSingleThreadContext(name = "SingleThread")
멀티스레드 디스패처 만들기
2개 이상의 스레드를 사용할 수 있는 멀티 스레드 디스패처를 만들기 위해 코루틴 라이브러리에서 제공하는 newFixedThreadPoolContext함수를 사용한다. 이 함수는 스레드의 개수(nThreads)와 스레드의 이름(name)을 인자로 받는다.
만들어지는 스레드들은 인자로 받은 name값 뒤에 '-1'부터 시작해 숫자가 하나씩 증가하는 형식으로 이름을 붙인다.
val multiTreadDispatcher: CoroutineDispatcher = nesFixedTreadPoolContxt(
nTreads = 2,
name = "MultiTread
)
코루틴 디스패처에는 세 가지 종류가 있다.
- Dispatchers.Unconfined
무제한 디스패처로 추후 다른 포스트잇으로 작성 예정. 우선은 나머지 디스패처에 더 집중해주세요!!
- Dispatchers.IO
- 네트워크 통신을 위해 HTTp 요청을 하거나 DB 작업 같은 입출력 작업을 위해 사용됨
- Dispatchers.Default
- 대용량 데이터를 처리해야 하는 작업처럼 CPU 연산 작업이 필요할 때 사용됨
- Dispatchers.Main
- Dispatchers.IO, Dispatchers.Default와 다르게 UI가 있는 애플리케이션에서 메인 스레드의 사용을 위해 사용됨
처리 방식이 어떻게 다르길래 Dispatcher 종류가 여러가지인 걸까?
입출력 작업과 CPU 바운드 작업의 중요한 차이는 스레드를 지속적으로 사용하는지 여부이다.
일반적으로 입출력 작업(네트워크 요청, DB 조회 요청 등)을 실행한 후 결과를 반환받을 때까지 스레드를 사용하지 않는다.
반면에 CPU 작업은 작업을 하는 동안 스레드를 지속적으로 사용한다.
입출력(I/O) 작업 | CPU 바운드 작업 | |
스레드 기반 작업 사용 시 | 느림 | 비슷 |
코루틴 사용 시 | 빠름 |
Dispatchers.IO와 Dispatchers.Default 알고보니 같은 스레드 풀을 사용한다.
코루틴 라이브러리의 공유 스레드 풀을 사용하기 때문
요악
1.코루틴 디스패처가 무엇인가요?
→ 코루틴을 스레드로 보내 실행하는 객체입니다. 코루틴을 작업 대기열에 적재한 후 사용이 가능한 스레드로 보내 실행합니다.
2. 제한된 디스패처와 무제한 디스패처의 차이는 무엇인가요?
→ 제한된 디스패처는 사용할 수 있는 스레드가 특정 스레드 또는 스레드 풀로 제한됩니다. 무제한 디스패처는 사용할 수 있는 스레드가 제한되지 않습니다.
3. 제한된 디스패처 객체를 생성하는 방법에는 어떤 것이 있을까요?
→ newSingleThreadContext를 사용해 단일 스레드 디스패처를 만들 수 있고 newFixedThreadPoolContext를 사용해 멀티 스레드 디스패처를 만들 수 있습니다.
4. CoroutineDispatcher 사용 방법은 어떻게 되나요?
→ launch 함수를 사용해 코루틴을 실행할 때 Context 인자로 CoroutineDispatcher 객체를 넘기면 해당 CoroutineDispatcher 객체를 사용해 코루틴이 실행됩니다.
5. 자식 코루틴은 기본적으로 부모 코루틴의 CoroutineDispatcher 객체를 상속받아 사용한다? O? X?
→ O
6. 코루틴 라이브러리에 미리 정의된 CoroutineDispatcher 객체가 무엇이 있나요?
→ Dispatchers.IO, Dispatchers.Default, Dispatchers.Main을 제공합니다.
7. Dispatchers.IO는 언제 사용할까요?
→ 입출력 작업을 할 때 사용됩니다. 예로는 네트워크 요청이나 파일 I/O, DB 조회 등이 있습니다.
8. Dispatchers.Default는 언제 사용되나요?
→ CPU 바운드 작업처럼 대용량 데이터를 처리할 때 사용됩니다.
9. Dispatchers.Default를 사용해 무겁고 오래 걸리는 연산을 처리하면 특정 연산을 위해 Dispatchers.Default의 모든 스레드가 사용될 수 있습니다. 이 경우 해당 연산이 모든 스레드를 사용하는 동안 Dispatchers.Default를 사용하는 다른 연산이 실행되지 못합니다. 이를 방지하기 위해 코루틴 라이브러리는 Dispatchers.Default의 일부 스레드만 사용해 특정 연산을 실행할 수 있도록 하는 것이 있습니다. 이것은 무엇일까요?
→ limitedParallelism( 리미티드 패러렐리즘 )을 사용해 Dispatchers.Default의 스레드 사용을 제한할 수 있습니다.
10. Dispatchers.Main을 사용하기 위해서는 의존성을 제공하는 별도의 라이브러리를 추가해야 합니다.
'android' 카테고리의 다른 글
[무결성 검증] 앱 서명키 비교 (0) | 2024.10.11 |
---|---|
startActivityForResult 너 누군데. ActivityResultLauncher를 써야 하는 이유 (2) | 2024.09.25 |
[Android] DI를 사용해보자 | Hilt (3) | 2024.09.05 |
[Android] Clean Architecture 클린 아키텍처 (2) | 2024.09.01 |
[Android] Serializable VS Parcelable (5) | 2024.08.28 |