Coroutine 취소 시점 체크
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를 활용하여 전체 로직을 관리하면, 코루틴이 취소될 상황에서 자연스럽게 스코프를 종료할 수 있습니다.
참고 자료
추가적으로 코루틴의 취소와 관련하여 다음 참고 자료가 유용할 수 있습니다:
- 코틀린 코루틴 공식 문서
- 관련 강의 질문과 답변 - 코루틴의 취소 체크 방법에 대한 실무적인 조언이 포함되어 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
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

