Coroutine에 대해 알아보자 (2)

차경민
쓱싹팀 이야기
4 min readJul 24, 2022
Photo by Firmbee.com on Unsplash

이 포스터는 코루틴 공식 가이드 읽고 분석하기 — Part 2 를 공부하여 재정리한 글입니다.

코루틴에서는 모든 중단함수들은 취소에 응답하고 대응할 수 있어야합니다.
만약 취소 요청이 있었다면 실행중이던 것을 즉시 중단하고 해야하며 코루틴 라이브러리에서는 이러한 취소 요청에 대응하도록 구현하고 있습니다.

중단 함수들은 취소 가능한 곳 마다 확인하며 취소가 되었으면 CancellationException 를 발생시키며 종료합니다.

코루틴에서 취소하는 방법은 여러가지가 있습니다.
취소하는 방법에 대해 알아보기 전에 취소되지 않은 코루틴에 대해 알아봅시다.

위의 코드를 실행시키면 취소 요청이 오더라도 취소되지 않고 실행되는 것을 확인할 수 있습니다.
왜냐하면 코루틴이 연산중이고 취소 여부를 확인하지 않은다면 취소할 수 없습니다.

이를 해결하기 위해 여러 방법이 있습니다.

isActive

isActive 함수는 현재 코루틴이 실행중인지 확인하는 함수 입니다.
Boolean 값을 반환하며 실행중이지 않을 때 작업을 중단할 수 있습니다.

위의 코드를 실행시켜보면 코루틴이 중단 된것을 확인할 수 있습니다.

yield()

yield 함수는 코루틴을 일시 중단하고 현재 실행중인지 확인하는 함수 입니다.

실행결과로 위와 마찬가지로 코루틴이 중단된 것을 확인할 수 있습니다.

중단 함수은 취되면 CancellationException 을 발생시킵니다. 만약 예외처리 시 해체해야하는 리소스가 있다면 try ~ finally 구문을 사용하는 방식과 Kotlin의 use() 함수를 사용하는 방법이 있습니다.

try~finally

다들 아시는 방법입니다. try시 에러가 발생시 finally에 작성해준 코드를 실행합니다.

use

Kotlin 의 use는 try-with-resource 와 마찬가지로 close 했을 시 작성해둔 코드를 싱행합니다.

취소 불가능한 코드 블록의 실행

이미 CancellableException 된 코루틴을 finally 구문에서 중단 함수를 호출되면 이미 취소되었기 때문에 CancellableException 를 발생합니다.

만약 이미 취소된 코루틴에서 중단함수를 호출해야 된다면 withContext{ } 코루틴 빌더에 NonCancellable 컨텍스트를 전달하면 됩니다.

타임 아웃

코루틴에서 수행 시간이 너무 길어졌을 때 우리는 타임 아웃을 지정하고 작업을 취소할 수 있습니다.

Job 객체 참조를 유지하며 별도의 취소를 하는것은 번거롭기 때문에 코루틴 에서는 withTimeout() 함수가 있습니다.

위의 코드를 실행하면 TimeoutCancellationException이 발생하는데 메인 함수에서 바로 실행되었기 때문입니다.

--

--