View
728x90
오늘 알아 볼것
저번 코루틴 포스트에 이어서 포스트하려고 한다.
Coroutine 구조
코루틴은 크게 Coroutine Scope, Coroutine Context, Coroutinew Builder 이렇게 3가지로 나눌 수 있다.
Coroutine Scope
코루틴의 동작하는 범위를 규정하고 스코프 내에서 실행되는 코루틴의 실행을 감시하거나 취소할 수 있다.
- Coroutine Scope: 인터페이스로 정의되며 특정한 dispatcher를 지정하여 동작이 실행될 스코프를 제한한다.
- Global Scope : Coroutine Scope의 한 종류로, 안드로이드에서 어플리케이션 라이프사이클을 따르며, 싱글톤으로 최상위 레벨에서 코루틴을 시작하기 때문에 필요할 때 만들어 쓰고 버리고 할 수 없다. 일반적으로 사용하는것을 지양한다.
Coroutine Context
코루틴은 항상 Coroutine context로 구성된 콘텍스트 안에서 실행되는데, 이 콘테스트는 Dispatchers와 Job으로 구성된다.
Dispatchers.Default
- cpu자원을 많이 필요로하는 작업에 사용된다.
- 공유 백그라운드 쓰레드의 common pool에서 동작한다.
- 동시작업 가능한 최대 개수는 cpu코어수와 같으며 최소 2개이다.
Dispatchers.IO
- 파일 혹은 소켓IO등의 가볍고 빈번한 IO작업에 사용한다.
- Blocking IO용 공유 쓰레드풀에서 동작한다.
- 필요에 따라 쓰레드를 추가 생성하거나 없앨 수 있는데 64 OR 코어 수중 큰 수 만큼 생성이 가능하다.
- Dispatchers.Default와 쓰레드를 공유하므로 withContext에서 Dispatcher 변경시 context switching하지 않고 동일한 쓰레드에서 실행이 된다.
Dispatchers.Main
- MainCoroutineDispatcher 클래스의 인스턴스이다.
- 안드로이드에서는 UI오브젝트를 다루는 메인쓰레드에서 동작한다.
- 일반적으로 싱글 쓰레드가 된다.
[간단 설명]
- Dispatchers.Main에는 UI 관련 작업이 모여 있는 쓰레드풀이다.
- Dispatchers.IO에는 데이터를 읽고 쓰는 작업이 모여 있는 쓰레드풀이다.
- Dispatchers.Default는 기본 쓰레드풀로, cpu 사용량이 많은 작업에 적합한 쓰레드풀이다.
Job와 Deferrend
코틀린에서는 코루틴 작업을 Job 혹은 Deferred라는 오브젝트로 만들어 다룬다.
Deferred는 결과값을 가지는 Job이므로 실제로는 둘 다 Job이다.
추상적인 개념인 코루틴을 Job이라는 오브젝트로 만들어 취소나 예외처리를 함으로서 코루틴의 흐름제어를 할 수 있게 된것이다.
Coroutine Builder
CoroutineBuilder에서 반환된 Job, Deferred 객체를 이용하여 각각의 Coroutine을 제어할 수 있다.
- launch
- 결과를 반환하지 않는 코루틴 시작에 사용
- 자체/자식 코루틴 실행을 취소할 수 있는 Job 반환
- async()
- 결과가 예상되는 코루틴 시작에 사용
- 전역으로 예외 처리 가능
- 결과, 예외 반환 가능한 Deferred 반환
- runBlocking()
- Blocking 코드를 일시 중지(suspend) 가능한 코드로 연결하기 위한 용도
- main함수나 Unit Test때 많이 사용됨
- 코루틴의 실행이 끝날 때 까지 현재 쓰레드를 차단함
- withContext()
- Dispatchers.Main으로 지정된 스코프 안에서 Dispatchers.IO가 필요한 처리를 해야할 일이 있을 수 있다.
이때 withContext를 사용하면 Dispatchersㄹㄹ 간편하게 스위치 할 수 있다.
- Dispatchers.Main으로 지정된 스코프 안에서 Dispatchers.IO가 필요한 처리를 해야할 일이 있을 수 있다.
Coroutine 지연예외처리
- delay: milisecond단위로 루틴을 잠시 대기 시킴, Thread.sleep은 쓰레드 자체를 정지시키는데 반해, delay는 코루틴을 멈추지 않고 잠시 대기 상태에 들어간다는 점에 차이가 이다.
- Join: Job의 실행이 끝날때까지 대기시킨다.
- await: Deferred의 실행이 끝날때까지 대기시키고 결과값을 반환한다.
Coroutine 취소
코루틴 실행을 취소하는 방법
- cancle: 위에서 설명한대로 job을 Canelling로 변환
- cancleAndJoin: job을 캔슬하고 Cancelled가 될 때까지 기다린다.
'TIL > 스터디' 카테고리의 다른 글
RoomDB(2편) (0) | 2024.03.14 |
---|---|
RoomDB (0) | 2024.03.14 |
코루틴-1(Coroutine) (0) | 2024.03.06 |
Calendar 클래스 (0) | 2024.02.29 |
hilt가 무엇인디? (3) | 2024.02.27 |
reply