시배's Android

Kotlin Coroutines Deep Dive | 8장. 잡과 자식 코루틴 기다리기 본문

Book/Kotlin Coroutines Deep Dive

Kotlin Coroutines Deep Dive | 8장. 잡과 자식 코루틴 기다리기

si8ae 2024. 1. 27. 20:12
  • 자식은 부모로부터 컨텍스트를 상속받습니다.
  • 부모는 모든 자식이 작업을 마칠 때까지 기다립니다.
  • 부모 코루틴이 취소되면 자식 코루틴도 취소됩니다.
  • 자식 코루틴에서 에러가 발생하면, 부모 코루틴 또한 에러로 소멸합니다.

Job 이란

  • 잡은 수명을 가지고 있으며 취소 가능합니다.
  • 잡은 인터페이스이긴 하지만 구체적인 사용법과 상태를 가지고 있다는 점에서 추상 클래스처럼 다룰 수도 있습니다.
  • 잡의 수명은 상태로 나타냅니다.
  • Active 상태에서는 잡이 실행되고 코루틴은 잡을 수행합니다.
  • 대부분의 코루틴은 Active 상태로 시작됩니다.
  • 지연 시작되는 코루틴만 New 상태에서 시작됩니다.
  • 실행이 완료되면 상태는 Completing으로 바뀌고 자식들을 기다립니다.
  • 자식들의 실행도 모두 끝났다면 잡은 마지막 상태인 Completed로 바뀝니다.
  • 잡이 실행 도중에 취소되거나 실패하게 되면 Cancelling 상태로 가게 됩니다.
  • 후처리 작업이 완료되면 Cancelled 상태가 됩니다.
상태 isActive isCompleted isCancelled
New (지연 시작될 때 시작 상태) false false false
Active (시작 상태 기본값) true false false
Completing (일시적인 상태) true false false
Cancelling (일시적인 상태) false false true
Cancelled (최종 상태) false true true
Completed (최종 상태) false true false
  • async 함수에 의해 반환되는 타입은 Deferred이며, Deferred 또한 Job 인터페이스를 구현하고 있기 때문에 똑같은 방법으로 사용할 수 있습니다.

자식들 기다리기

  • 잡의 첫 번째 중요한 이점은 코루틴이 완료될 때까지 기다리는 데 사용될 수 있다는 점입니다.
  • join은 지정한 잡이 Completed Cancelled와 같은 마지막 상태에 도달할 때까지 기다리는 중단함수입니다.

잡 팩토리 함수

  • Job은 Job() 팩토리 함수를 사용하면 코루틴 없이도 Job을 만들 수 있습니다.
  • 팩토리 함수로 생성하는 잡은 어떤 코루틴과도 연관되지 않으며, 컨텍스트로 사용될 수 있습니다.
  • 흔한 실수 중 하나는 Job 팩토리 함수를 사용해 잡을 생성하고 다른 코루틴의 부모로 지정한 뒤에 join을 호출하는 것입니다.
  • 자식 코루틴이 모두 끝마쳐도 Job이 여전히 액티브 상태에 있기 때문에 프로그램이 종료되지 않습니다.
  • 팩토리 함수로 만들어진 잡은 다른 코루틴에 의해 여전히 사용될 수 있기 떄문입니다.
  • Job은 생성자처럼 보이는 간단한 함수로, 가짜 생성자입니다.
  • 팩토리 함수가 반환하는 실제 타입은 Job이 아니라 하위 인터페이스인 CompletableJob입니다.
  • complete() : 잡을 완료하는 데 사용됩니다.
  • complete를 호출한 잡에서 새로운 코루틴이 시작될 수는 없습니다.
  • completeExceptionally(exception) : 인자로 받은 예외로 잡을 완료시킵니다.