작성
·
40
답변 2
0
안녕하세요 태혁님! 🙂 좋은 질문 감사합니다.
잘 아시는 것처럼 suspend
함수는 중단될 '수도' 있는 지점입니다. 즉 바꿔 말하면 중단되지 않을 수도 있다는 의미이고, 실제 중단이 될지, 중단이 되지 않을지는 내부의 구현에 따라 달려 있습니다.
예를 들어 delay(1_000L)
는 실제 1초 후에 다음 지점에서 재개해야 하므로 중단이 일어나는 suspend 함수인건데요,
delay의 구현을 보면
public suspend fun delay(timeMillis: Long) {
if (timeMillis <= 0) return // don't delay
return suspendCancellableCoroutine sc@ { cont: CancellableContinuation<Unit> ->
// if timeMillis == Long.MAX_VALUE then just wait forever like awaitCancellation, don't schedule.
if (timeMillis < Long.MAX_VALUE) {
cont.context.delay.scheduleResumeAfterDelay(timeMillis, cont)
}
}
}
와 같은 코드를 확인할 수 있고, 여기서 실질적으로 scheduleResumeAfterDelay
이란 함수가 호출되며 중단이 일어나게 됩니다. 다시 scheduleResumeAfterDelay
라는 함수는 Dispatchers
와 같이 코루틴의 스케줄링을 담당하는 클래스에 구현이 되어 있는데 이를 바꿔 표현하면 코루틴 스케줄러에게 중단 신호를 보내면 스케줄러 구현에 따라 직접 중단을 한다고 할 수 있습니다.
물론 이 과정에서 중단이 된 Job (= Coroutine)은 Context 같은 곳에 상태를 변경하게 (isActive=false로 바꾼다거나요~) 될거에요! 🙂
제가 모든 중단 로직을 확인해본 것은 아니지만, 결국 실제 중단을 일으키는 함수의 구현에 따라 조금씩 다를 수 있지 않을까 싶습니다. 답변이 도움이 되었으면 좋겠습니다. 감사합니다. 🙇
0
안녕하세요, 인프런 AI 인턴입니다. 성태혁님!
코루틴의 중단과 재개는 코루틴의 중요한 특징인데요. 쉽게 설명드리자면, 중단(suspend)은 코루틴이 실행을 일시적으로 멈추고, 이후에 작업이 준비되었을 때 다시 재개(resume)되는 것을 의미합니다.
코루틴이 중단되는 중단점은 보통 suspend
함수가 호출될 때 발생합니다. 이때 코루틴은 “어디까지 실행했는지”라는 상태를 저장하고, 더 이상 작업이 대기 중인 상태로 남아 있게 됩니다. 내부적으로 Continuation
인터페이스가 이러한 상태를 유지하는 데 사용됩니다. 코루틴을 처음 시작할 때에도 이 Continuation
이 코드의 진전 상태를 추적합니다.
재개는 바로 이 Continuation
의 resumeWith
메서드를 통해 이루어집니다. 이를 통해 코루틴이 다시 실행되어 중단된 부분으로 돌아올 수 있게 됩니다. 중단의 메커니즘은 CoroutineContext
를 이용하지 않고, 코틀린 컴파일러가 자동으로 생성하는 코드에 포함된 Continuation
을 통해 이루어집니다.
이와 관련된 추가 내용이나 개념상 어려운 부분이 있다면, 기존 강의 게시판의 유사한 질문들을 참고하시면 좋습니다. 예를 들어:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드립니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.