inflearn logo
강의

Course

Instructor

Complete Kotlin Coroutines

When to check for coroutine cancellation

Coroutine 취소 시점 체크

Resolved

139

111sym

1 asked

1

isActive라는 확장 프로퍼티를 이용해서 일시 중단 시점을 만들지 않고도 확인할 수 있다는 내용은 이해했습니다.

다만 본 강의의 예시에서는 while문을 통해서 계속해서 isActive를 확인해서 취소된 걸 곧바로 알 수 있었지만,


만약 실무에서 coroutine내에 어떤 로직들이 길게 적혀 있다면, 한 줄 한줄 마다 if 문을 통해 isActive를 확인해야 하는 코드가 들어가야 하는 걸까요? 아니면 조금 비효율적인 것을 감안하고 yield 같은 함수를 중간 중간에 넣어두어야 하는 걸까요?

android kotlin coroutine kotlinx.coroutines android-coroutine

Answer 2

2

seyoungcho2

111sym님 안녕하세요. 지식 공유자 조세영입니다.

일반적인 경우에는 코루틴 내에 로직들이 길게 적혀 있다면, IO 작업 등에서 코루틴이 일시 중단되면 취소가 체크되기 때문에 한 줄 한 줄 마다 isActive를 확인할 필요가 없습니다.

이런 체크가 필요한 경우는 일반적으로 취소를 체크할 수 있는 시점이 없는 CPU 집약적인 작업 혹은 완료되기 전 다시 한 번 취소를 체크해야 하는 코루틴의 경우 등 입니다.

정리하면 모든 줄에서 취소를 확인할 필요는 없으며, 다음 작업 전에 취소 체크가 명시적으로 필요한 부분에 한해 한정적으로 사용하는 것이 좋습니다.

 

좋은 질문 남겨 주셔서 감사합니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 111sym님.

코루틴의 작업 취소와 관련된 질문을 주셔서 감사합니다. isActive 확장 프로퍼티를 통해 코루틴이 취소되었는지 확인하는 방법은 유용하지만, 모든 코드 줄마다 체크하는 것은 비효율적일 수 있습니다. 실무에서 코루틴 내에서 효율적으로 취소를 확인하기 위한 방법을 살펴보겠습니다.

코루틴 취소 점검 방법

  1. 일시 중단 함수 사용: 대부분의 표준 일시 중단 함수는 코루틴의 취소를 자동으로 체크합니다. 따라서 이러한 함수(예: delay, withTimeout)를 사용하면, 직접적으로 isActive를 자주 사용할 필요가 없습니다.

  2. 주기적인 체크: 특정 구역 내에 주기적으로 yield()를 호출하여 취소가 요청되었는지 확인할 수 있습니다. 이 방법은 긴 루프 또는 많은 논리 코드가 실행될 때 적합합니다.

   while (isActive) {
       // 작업 수행
       yield() // 취소 체크
   }
  1. 예외를 통한 취소 처리: 코루틴이 취소되면 CancellationException이 발생합니다. 이를 통해 전체 로직을 간결하게 유지하면서도 한 번에 취소를 처리할 수 있습니다.
   try {
       // 긴 작업 수행
   } catch (e: CancellationException) {
       // 작업 중지 및 필요한 정리 작업 수행
   }
  1. 구간 나누기: 긴 로직은 여러 구간으로 분리하고 각 구간마다 취소 여부를 체크하는 것이 좋습니다. 이렇게 하면 코드 관리가 용이해지며, 취소도 효율적으로 처리할 수 있습니다.

  2. 구조화된 동시성: 코루틴을 각기 다른 구조로 나누고, coroutineScopesupervisorScope를 활용하여 전체 로직을 관리하면, 코루틴이 취소될 상황에서 자연스럽게 스코프를 종료할 수 있습니다.

참고 자료

추가적으로 코루틴의 취소와 관련하여 다음 참고 자료가 유용할 수 있습니다:
- 코틀린 코루틴 공식 문서
- 관련 강의 질문과 답변 - 코루틴의 취소 체크 방법에 대한 실무적인 조언이 포함되어 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

CoroutineDispatcher에 대한 질문

0

79

2

코루틴과 JVM이 끝나는 조건에 대해 문의 드립니다.

0

83

2

Job() 생성후 complete을 불러 주어야 하는 경우가 헷깔립니다.

1

66

1

왜 runBlocking 종료로 메인스레드가 종료될까요?

0

120

1

cancel 질문드립니다.

1

85

2

delay 함수 사용 시 스레드 양보

1

127

2

강사님께서 번역해주신 코틀린 코루틴 공식 가이드 문서 문의

2

150

2

Flow와 Channel

1

146

2

[코틀린 코루틴의 정석 책 추첨 이벤트] 강의 구매 기간 관련 문의

1

221

1

[코루틴 테스트 심화] runTest의 스레드 관련 문의

1

164

2

job과 코루틴의 관계?

3

258

2

코루틴의 blocking I/O작업 처리

0

161

2

KTOR Server 에서 delay

0

136

2

CoroutineDispatcher(Default, IO)의 limitedParallelism 관련 질문

1

242

1

suspend 문의 드려요

2

131

2

스레드 양보 예제 + 코루틴/멀티스레드 사용 예시 질문

1

184

2

coroutineScope 관련 질문 및 실제 사용 사례에 대한 질문

1

258

3

spring web mvc 환경에서 coroutine을 사용해보신 경험이 있으신지 궁금합니다.

1

326

2

코루틴이 멀티스레드의 단점을 해결했다는 부분에 대해 질문드립니다.

2

182

1

Dispatcher.IO의 동작원리

0

254

3

실무에서 runBlocking 와 CoroutineScope 실무 사용에 대해

0

238

2

Code3-6에서 imageProcessingDispatcher가 inline으로는 동작하지 않는 이유가 궁금합니다

1

121

2

공유 스레드 풀 질문드려요!

1

158

2

코루틴 이름 출력관련해서 질문이 있습니다!

2

160

1