인프런 커뮤니티 질문&답변

111sym님의 프로필 이미지
111sym

작성한 질문수

코틀린 코루틴 완전 정복

코루틴 취소 확인 시점

Coroutine 취소 시점 체크

해결된 질문

작성

·

33

·

수정됨

1

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

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


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

답변 2

2

조세영님의 프로필 이미지
조세영
지식공유자

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

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

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

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

 

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

0

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

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

코루틴 취소 점검 방법

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

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

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

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

참고 자료

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

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

111sym님의 프로필 이미지
111sym

작성한 질문수

질문하기