해결된 질문
작성
·
33
·
수정됨
1
isActive라는 확장 프로퍼티를 이용해서 일시 중단 시점을 만들지 않고도 확인할 수 있다는 내용은 이해했습니다.
다만 본 강의의 예시에서는 while문을 통해서 계속해서 isActive를 확인해서 취소된 걸 곧바로 알 수 있었지만,
만약 실무에서 coroutine내에 어떤 로직들이 길게 적혀 있다면, 한 줄 한줄 마다 if 문을 통해 isActive를 확인해야 하는 코드가 들어가야 하는 걸까요? 아니면 조금 비효율적인 것을 감안하고 yield 같은 함수를 중간 중간에 넣어두어야 하는 걸까요?
답변 2
2
111sym님 안녕하세요. 지식 공유자 조세영입니다.
일반적인 경우에는 코루틴 내에 로직들이 길게 적혀 있다면, IO 작업 등에서 코루틴이 일시 중단되면 취소가 체크되기 때문에 한 줄 한 줄 마다 isActive를 확인할 필요가 없습니다.
이런 체크가 필요한 경우는 일반적으로 취소를 체크할 수 있는 시점이 없는 CPU 집약적인 작업 혹은 완료되기 전 다시 한 번 취소를 체크해야 하는 코루틴의 경우 등 입니다.
정리하면 모든 줄에서 취소를 확인할 필요는 없으며, 다음 작업 전에 취소 체크가 명시적으로 필요한 부분에 한해 한정적으로 사용하는 것이 좋습니다.
좋은 질문 남겨 주셔서 감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 111sym님.
코루틴의 작업 취소와 관련된 질문을 주셔서 감사합니다. isActive
확장 프로퍼티를 통해 코루틴이 취소되었는지 확인하는 방법은 유용하지만, 모든 코드 줄마다 체크하는 것은 비효율적일 수 있습니다. 실무에서 코루틴 내에서 효율적으로 취소를 확인하기 위한 방법을 살펴보겠습니다.
일시 중단 함수 사용: 대부분의 표준 일시 중단 함수는 코루틴의 취소를 자동으로 체크합니다. 따라서 이러한 함수(예: delay
, withTimeout
)를 사용하면, 직접적으로 isActive
를 자주 사용할 필요가 없습니다.
주기적인 체크: 특정 구역 내에 주기적으로 yield()
를 호출하여 취소가 요청되었는지 확인할 수 있습니다. 이 방법은 긴 루프 또는 많은 논리 코드가 실행될 때 적합합니다.
while (isActive) {
// 작업 수행
yield() // 취소 체크
}
CancellationException
이 발생합니다. 이를 통해 전체 로직을 간결하게 유지하면서도 한 번에 취소를 처리할 수 있습니다. try {
// 긴 작업 수행
} catch (e: CancellationException) {
// 작업 중지 및 필요한 정리 작업 수행
}
구간 나누기: 긴 로직은 여러 구간으로 분리하고 각 구간마다 취소 여부를 체크하는 것이 좋습니다. 이렇게 하면 코드 관리가 용이해지며, 취소도 효율적으로 처리할 수 있습니다.
구조화된 동시성: 코루틴을 각기 다른 구조로 나누고, coroutineScope
나 supervisorScope
를 활용하여 전체 로직을 관리하면, 코루틴이 취소될 상황에서 자연스럽게 스코프를 종료할 수 있습니다.
추가적으로 코루틴의 취소와 관련하여 다음 참고 자료가 유용할 수 있습니다:
- 코틀린 코루틴 공식 문서
- 관련 강의 질문과 답변 - 코루틴의 취소 체크 방법에 대한 실무적인 조언이 포함되어 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.