Cancellation and Timeouts
- Cancelling coroutine execution
1> 어플리케이션의 긴 동작에 있어 백그라운드 코루틴의 동작이 정교하게 진행되어야할 필요성이 생길 것이다.
2> 예를 들어 코루틴이 lauched된 어떤 앱에서 user가 page를 close하면 거기서 동작하는 코루틴은 필요가 없다.
3< launch function은 Job을 반환하고 이를 통해 실행중인 코루틴을 중지할 수 있다.
위의 예제에서는 job 객체가스스로 5번 돌고 나서 I'm sleeping이라는 문구가 출력된다.
- Making computation code cancellable
1> computation code를 취소하는 방법은 2가지가 있다.
2> cancellation을 위한 체크를 수행하기 위한 suspening function을 주기적으로 촉발(invoke)시키는 것(1)과 yield function은 그러한 목적을 수행하기 위한 좋은 예가 된다.
3> 두번째 방법은 명시적으로 체크를 해서 cancellation 상태를 확인하는 것이다.
위의 예제는 while(isActive)에 의해 알고리즘이 제어되며, cancelAndJoin을 호출하여 코루틴을 종료 시킬수 있다.
이때, isActive는 CoroutineScope 객체를 통해 코루틴 안에서 사용할 수 있는 extension property 이다.
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
기억할 만한 키워드
isActive(isActive)
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- Closing resources with finally
Cancellable한 suspending function들은 cancellation의 상황에서 통상적인(usual) 방법을 적용하여(finally, catch, try) CancellationException을 throw할 수 있다.
join과 cancelAndJoin은 finalization actions가 complete될 떄까지 기다린다. 그래서 위 예제는 아래와 같은 output을 가지고 있다.
- Run non-cancellable block
1> 이전 예에서 finally block안에 suspending을 사용하려는 시도는 CancellationException를 야기할 수 있다. 왜냐하면 이 코드를 실행하는 코루틴이 cancelled 되었기 때문이다.
2> operation을 정상적으로 작용하는 모든 닫기 작업(파일 닫기, job cancel, 모든 종료의 통신채널 닫기 등)은 대개 non-blocking이고, 이는 어떠한 suspending function을 포함하지않기 때문에 일반적으로 문제가 되지않는다.
3> suspend를 cancelled 코루틴 에서 사용할 필요가 생겼을 경우와 같은 흔치 않은 예에서는 응답하는 코드(corresponding code)를 withContext(NonCancllable)로 감쌀 수 있다(그림4 참조).
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
기억할 만한 키워드
isActive(isActive)
cancelAndJoin
withContext(NonCancellable)
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- Timeout
1> 코루틴의 cancel 실행을 하기위한 가장 실질적인 명백한 이유는 timeout에 의한 실행시간 초과때문이다.
2> Job에 대응되는 참조를 수동적(manually)으로 추적하고 별도의 코루틴을 시작(launch)하여 지연이 된 후 추적된 것을 취소할 수 있지만, wimeTimeout 함수를 사용하면 손쉽게 이 문제를 해결할 수 있다.
3>withTimeout에 의해 throw되는 TimeoutCancellationException은 CancellationException의 하위 클래스이다.
4> 이전에 콘솔에 스택 추적이 프린트 된 것을 보지 못했는데, 취소된 코루틴 내부의 CancellationException이 코루틴 완료의 정상적인 이유로 간주되기 때문임.
5> 그러나 이러한 예제는 main function 당장 안쪽에서 withTimeout을 사용하였다.
6> 취소는 단지 exception 일 뿐이므로 모든 리소스는 일반적인 방식으로 닫힌다. 특별히 모든 종류의 시간 제한에 대해 추가 작업을 수행해야하거나 다음과 유사한 withTimeoutOrNull 함수를 사용해야하는 경우 try {...} catch (e : TimeoutCancellationException) {...} 블록에서 timeout으로 코드를 감쌀 수 있다. withTimeout이지만 예외를 던지는 대신 시간 초과시 null을 반환한다.
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
기억할 만한 키워드
isActive(isActive)
cancelAndJoin
withContext(NonCancellable)
TimeoutCancellationException
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
'Programming Theory > 코루틴(Coruotine)' 카테고리의 다른 글
Coroutines guide, kotlinx-coroutines-core / flow (0) | 2022.02.01 |
---|---|
Coroutines guide + Flow 정리(2022) (0) | 2022.01.22 |
kotlin Coroutine 정리(4, Coroutine Context and Dispatchers) (0) | 2020.09.22 |
kotlin Coroutine 정리(3, Composing Suspending Functions) (0) | 2020.09.21 |
Kotlin Coroutine 정리(1, Basics) (1) | 2020.09.16 |