Kotlin Coroutine 정리(2, Cancellation and Timeouts)

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

 CancellationException

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

 CancellationException

withContext(NonCancellable)

TimeoutCancellationException

withTimeout

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유