View

코루틴-2(Coroutine)

제롱구리 2024. 3. 7. 14:49
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ㄹㄹ 간편하게 스위치 할 수 있다.

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
Share Link
reply
«   2024/11   »
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