-
[Study] 코틀린 동시성 프로그래밍 - 3장. 라이프 사이클과 에러 핸들링LANGUAGE/KOTLIN 2022. 9. 5. 23:06
2장에서는 안드로이드 UI 스레드에서 네트워크를 요청하면 블로킹이 발생하여, 네트워크에서 코루틴을 사용하고 결과만 UI 스레드에서 합쳐서 쓰는 것을 익혔다
3장에서는 두가지 유형의 비동기 작업을 살펴본다
- Job
- Deferred
비동기 함수를 쉽게 나눠 볼 수 있는 두가지
- 결과가 없는 비동기 -> job
- 로그를 기록하고 전송하는 것을 백그라운드 작업으로 하는데, 이것이 완료되고 있는지 여부는 검사하지 않는다
- 결과를 반환하는 비동기 -> deferred
- 결과를 활용해야되는 경우
- 두가지 경우 다 예외가 발생하거나, 해당작업이 필요하지 않을때 취소를 할 수 있음
Job
- Fire And Forget : 예외가 발생하지 않는한 대기하지 않는다.
fun main(args: Array<String> = runBlocking { val job = GlobalScope.launch { } }
- launch 를 사용해 잡을 생성함 or Job()
- JobSupport 구현체를 사용
- 예외처리
- Job 내부에서 발생한 예외는 Job을 생성한 곳까지 전파됨
- 현재 스레드에 Uncauht Exception Handler에 예외가 전파됨
- 라이프 사이클
- New → 실행 안된 job
- launch(), Job() 을 사용하면 자동으로 생성 후 시작됨
- 자동 시작이 안되게 하려면 CoroutineStart.LAZY 를 쓰면 됨
- Active → 실행 중인 job
- 생성상태에 있는 Job을 실행하는 방법 → start(), join()
- start : 어플리케이션은 완료되는 것을 기다리지 않음(일시중단 x)
- join : 어플리케이션이 완료할때까지 대기함
- Canceling → 실행 중인 job에서 cancel() 호출되면 취소완료 될때까지의 상태
- cancel() 호출할때 cause를 넘길 수 있음(근데 deprecated 됨)
- cancelAndJoin()도 있는데, 취소할때까지 기다림
- Cancelled → 취소로 인해 완료된 Job (completed로 분류하기도 함)
- getCancellationException을 통해 job에 대한 취소 정보를 알 수 있음
- 아니면 Handler를 넘겨줘서 취소작업을 처리한다.
- Completed → 더 이상 실행이 불가능한 Job
- New → 실행 안된 job
Deferred
- 결과를 반환하는 비동기 작업
- promise, futures
- 연산은 객체를 반환하고, 비동기 작업이 완료될때까지 객체가 비어있음
- deferred를 만들려면 async, await으로 만들 수 있음
- 예외처리
- 예외를 자동으로 전파하지 않음(Job과 다른점)
- 결과를 대기할 것으로 예상하기 때문
- 실행이 성공했는지 확인하는 것이 사용자의 몫
- 예외처리 전파 안됨
- CoroutineExceptionHandler 를 job 처럼 동일하게 사용가능
- 상태는 한 방향으로만 감
- Job이 완료된 경우 다시 실행 불가능
'LANGUAGE > KOTLIN' 카테고리의 다른 글
[Study] 코틀린 동시성 프로그래밍 - 2장. 코루틴 인 액션 (0) 2022.08.12 [Study] 코틀린 동시성 프로그래밍 - 1장 Hello, Concurrent World! (0) 2022.08.12