시배's Android

Kotlin Coroutines Deep Dive | 9장. 취소 본문

Book/Kotlin Coroutines Deep Dive

Kotlin Coroutines Deep Dive | 9장. 취소

si8ae 2024. 1. 27. 21:52
  • 단순히 스레드를 죽이면 연결을 닫고 자원을 해제하는 기회가 없기 때문에 최악의 취소 방식입니다.

기본적인 취소

  • Job 인터페이스는 취소하게 하는 cancel 메서드를 가지고 있습니다.
  • 호출한 코루틴은 첫 번째 중단점에서 잡을 끝냅니다.
  • 잡이 자식을 가지고 있다면, 그들 또한 취소됩니다. 하지만 부모는 영향을 받지 않습니다.
  • 잡이 취소되면, 취소된 잡은 새로운 코루틴의 부모로 사용될 수 없습니다.
  • cancel 함수의 인자로 사용되는 예외는 반드시 CancelationException의 서브타입이어야 합니다.
  • cancel이 호출된 뒤 다음 작업을 진행하기 전에 취소 과정이 완료되는 걸 기다리기 위해 join을 사용하는 것이 일반적입니다.
  • join을 호출하지 않으면 경쟁상태가 될 수도 있습니다.
  • 잡이 취소되면 Cancelling 상태로 바뀝니다.
  • 상태가 바뀐 뒤 첫 번째 중단점에서 CancellationException 예외를 던집니다.
  • 취소된 코루틴이 단지 멈추는 것이 아니라 내부적으로 예외를 사용해 취소되는 걸 명심해야 합니다.
  • finally 블록 안에서 모든 것을 정리할 수 있습니다.

취소 중 코루틴을 한 번 더 호출하기

  • 가끔씩 코루틴이 이미 취소되었을 때 중단 함수를 반드시 호출해야 하는 경우도 있습니다.
  • 예를 들면 데이터베이스의 변경 사항을 롤백하는 경우입니다.
  • withContext(NonCancellable)로 포장하는 방법이 많이 사용되고 있습니다.
  • 블록 내부에서 잡은 액티브 상태를 유지하며, 중단 함수를 원하는 만큼 호출할 수 있습니다.
  • invokeOnCompletion 메서드는 잡이 Completed나 Cancelled와 같은 마지막 상태에 도달했을 때 호출될 핸들러를 지정하는 역할을 합니다.
  • 취소는 중단점에서 일어나기 때문에 중단점이 없으면 취소를 할 수 없습니다.
  • yield는 코루틴을 중단하고 즉시 재실행합니다.

suspendCancellableCoroutine

  • 이 함수는 suspendCoroutine과 비슷하지만, 컨티뉴에이션 객체를 몇 가지 메서드가 추가된 CancellableContinuation로 래핑합니다.
  • 코루틴이 취소되었을 때 행동을 정의하는 데 사용하는 invokeCancellation 메서드 입니다.