일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 프로세스
- DiffUtil
- http 역사
- 디자인 패턴
- 리사이클러뷰
- AAC
- http발전과정
- appcompatactivity
- apk 빌드 과정
- Kotlin
- 리사이클러뷰풀
- 자이고트
- 물리 메모리
- 안드로이드
- appcompatacitivity
- flutter
- NestedScrollView
- 데코레이터 패턴
- GetX
- Dispatchers
- 뷰홀더
- viewModelScope
- 운영체제
- 내부 단편화
- 절대 주소
- Android
- AsyncListDiffer
- recyclerview
- 플로이드워셜
- 상태관리
- Today
- Total
hong's android
[안드로이드] 코루틴 CoroutineScope와 Dispatchers 본문
CoroutineScope 란?
모든 coroutine은 scope 내에서 실행되어야 합니다.
- GlobalScope는 별도의 생명주기를 신경 쓰지 않고 앱의 시작 ~ 종료까지 유지되는 scope이다.
- aac workmanager와 함께 백그라운드에서 장기간 실행 되어야 하는 경우 적합하다.
- CoroutineScope는 어떤 목적(네트워크 통신, io 등)을 가지고 종료하기 위한 scope이다.
- GlobalScope와 CoroutineScope은 CoroutineScope 인터페이스를 상속받는다.
public interface CoroutineScope {
/**
* Context of this scope.
*/
public val coroutineContext: CoroutineContext
}
GlobalScope와 CoroutineScope()의 차이점
- GlobalScope는 Signleton이기 때문에 Application이 살아있는 동안은 계속 살아있습니다.
- CoroutineScope()는 객체를 생성하기 때문에 호출한 객체가 메모리에서 해제가 되면 같이 파괴가 됩니다. 하지만, 원하는 대로 작동하려면 적절하게 cancel을 호출해줘야 해당 코루틴 작업이 취소됩니다.
Dispatcher란?
코루틴은 Dispatcher를 이용해서 실행할 스레드를 정합니다.
안드로이드에서 제공하는 Dispatcher 종류
Dispatchers.Main : Ui 작업을 위해 코루틴을 메인 스레드로 이동 시킨다. 이 디스패처는 UI와 상호작용하고 빠른 작업을 실행하기 위해서만 사용해야 한다. 예를 들어 suspend 함수를 호출하고 Android UI 프레임워크 작업을 실행하며 LiveData 객체를 업데이트합니다.
Dispatchers.IO : 이 디스패처는 기본 스레드 외부에서 디스크 또는 네트워크 I/O를 실행하도록 최적화되어 있다. 예를 들어 파일에서 읽거나 파일에 쓰며 네트워크 작업을 실행한다. 스레드 풀의 추가적인 스레드는 필요에 따라 생성되고, 제거된다. Dispatcher.Default는 IO Dispatcher와 스레드를 공유한다. 즉 동일한 스레드를 사용한다. 디폴트는 64개의 스레드로 제한되어 있으며, 코어의 수가 그것보다 크면 코어의 수만큼 제한합니다.
코루틴의 스레드들은 excutors 클래스의 구현체인 코루틴 스케쥴러에 의해 task라는 단위로 관리되고 실행하게 됩니다. Dispatchers.IO는 최대 스레드를 제한하기에 코루틴 스케쥴러에 의해서 Task로 추가되기 전에 LimitingDispatcher에 의해 동시에 실행하는 스레드들이 제한 수치를 넘지 않도록 관리합니다. 제한 개수를 넘는다면 따로 큐에 저장하게 됩니다.
Dispatchers.Default : 이 디스패처는 CPU를 많이 사용하는 작업을 기본 스레드 외부에서 실행하도록 최적화되어 있다. Launch, async 같은 모든 표준 빌더에서 사용됩니다. 예를 들어 목록을 정렬하고 JSON을 파싱 하는 작업을 할 때 쓰일 수 있다. Cpu 집약적인 연산을 한다면 Dispatchers.Default를 사용해야 합니다. jvm의 공유 스레드 풀을 사용하고 쓰레드 풀의 크기는 기기의 코어 수와 같습니다.
Dispatchers.Unconfined : 사용할 스레드 풀을 따로 지정해주지 않는다. 호출한 context를 기본으로 사용하는데 중단한 후 다시 실행할 때 context가 바뀌면 해당 context를 따라갑니다.
Reference.
1. https://developer.android.com/kotlin/coroutines/coroutines-adv?hl=ko
'Android > Coroutine' 카테고리의 다른 글
[안드로이드] 코루틴의 Suspend와 CPS (수정중) (0) | 2023.03.07 |
---|---|
[안드로이드] Coroutine 이란? (1) | 2023.02.28 |