본문 바로가기

카테고리 없음

코틀린 동시성 프로그래밍 - 3

728x90

Job Vs Deferred

 

Job :

-Fire and Forget 방식 작업

- 한 번 시작된 작업은 예외가 발생하지 않는한 대기하지 않는다.

- launch 블록을 통해 생성

- 잡의 예외는 잡을 생성한 곳 까지 전파된다. 

 

잡의 라이프 사이클 

 

                                          wait children
    +-----+ start  +--------+ complete   +-------------+  finish  +-----------+
    | New | -----> | Active | ---------> | Completing  | -------> | Completed |
    +-----+        +--------+            +-------------+          +-----------+
                     |  cancel / fail       |
                     |     +----------------+
                     |     |
                     V     V
                 +------------+                           finish  +-----------+
                 | Cancelling | --------------------------------> | Cancelled |
                 +------------+                                   +-----------+

New : 존재하지 만 아직 실행되기 전

Active : 실행중인 잡, (일시 중단 도 포함)

Completed : 잡이 완료 더이상 실행되지 않음

Cancelling : Job.zcancel() 이 호출되어 취소가 완료되기전까지의 상태

Canceled : 취소로 인해 실행이 완료된 잡

 

잡은 기본적으로 생성할떄 자동으로 시작됨 (이를 막기 위해선 CouroutineStart.Lazy 사용)

 

start vs join 

start 는 잡이 완료될때까지 기다리지 않는다. join은 잡이 완료될떄까지 실행을 일시 중단한다.

 

Job이 취소되면 getCancellationException()을 통해 취소에 대한 정보를 얻을수 있다.

 

취소된 잡과 예외로 인해 실패한 잡을 구혈하기 위해 CoroutineExceptionHandler을 설정하여 취소 작업을 처리하는 것이 좋다.

 

잡의 현재 상태 확인

isActive

isCompleted

isCancelled

 

 

Deferred

 

- 결과를 갖는 비동기 작업으로 Job를 확장하는 개념이다.(다른 언어의 Promise, Future)

- async 블록을 이용하여 만들거나 CompletableDeferred의 생성자를 사용한다.

 

예외 처리

Job과 다르게 Deferred는 처리되지 않는 예외를 자동으로 전파하지 않는다.

Deferred의 결과를 대기할 것으로 예상하기 때문에 이런 방식을 사용했다.

실행이 성공했는지 확인하는것은 사용자의 몫이다.

 

Job이 특정상태에 도달하면 이전 상태로 되돌아가지 않는다.