프로그래밍/Kotlin

Kotlin coroutine : async vs launch 차이

Lou Park 2022. 11. 1. 23:45

async vs launch

  • async
    • 결과를 반환하는 코루틴을 시작하는데 사용
    • 예외(Exception)가 발생할 경우 결과를 반환에 포함한다.
    • 결과 또는 예외를 포함하는 Deferred<T>를 반환
  • launch
    • 결과를 반환하지 않는 코루틴을 시작하는데 사용
    • 본인 혹은 자신 코루틴의 실행을 취소하기위해 사용할 수 있는 Job을 반환
    • Job: Fire and forget

Job

Job은 생성될때 기본적으로 자동 시작된다.

하지만, 이를 자동시작 되지 않게하려면 CoroutineStart.LAZY를 사용할 수 있다.

 

Job join() vs start()

  • join: Job을 완료할때까지 대기한다.
  • start: 애플리케이션이 Job이 완료될때까지 기다리지 않는다.

Job의 라이프 사이클

  • New: 생성됨
  • Active: 실행중인 Job / 일시중단된 Job
  • Completed: Job이 더 이상 실행되지 않음
  • Canceling: Active상태에서 cancel() 호출 후 취소될때까지 사이
  • Cancelled: 취소된 Job. Completed 상태이기도 하다.
  • Job의 상태는 한 방향으로만 이동한다. 이미 완료된 Job을 다시 시작한다고 해서 시작되지 않는다.

Deferred

  • 결과를 갖는 비동기 작업을 수행하기 위한 Job의 확장
  • 다른 언어의 Future, Promise와 비슷하다.

Deferred join() vs await()

  • join: 예외가 발생할 경우, Deferred.getCompletionExceptionOrNull()으로 Exception을 가져올 수 있다. 실행은 예외를 전파하지 않고 마무리 된다.
  • await: 예외가 전파되고(throws exception), 실행은 실패한다.

 

 

*출처: 코틀린 동시성 프로그래밍