ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

     

    Deferred

    • 결과를 반환하는 비동기 작업
      • promise, futures
      • 연산은 객체를 반환하고, 비동기 작업이 완료될때까지 객체가 비어있음
    • deferred를 만들려면 async, await으로 만들 수 있음
    • 예외처리
      • 예외를 자동으로 전파하지 않음(Job과 다른점)
      • 결과를 대기할 것으로 예상하기 때문
        • 실행이 성공했는지 확인하는 것이 사용자의 몫
      • 예외처리 전파 안됨
      • CoroutineExceptionHandler 를 job 처럼 동일하게 사용가능
    • 상태는 한 방향으로만 감
      • Job이 완료된 경우 다시 실행 불가능

    댓글

Designed by Tistory.