인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

성태혁님의 프로필 이미지

작성한 질문수

2시간으로 끝내는 코루틴

9강. 코루틴과 Continuation

9강 코루틴 중단과 재개관련 문의 드립니다.

작성

·

40

0

강의 정말 재미있게 잘 듣고 있습니다. 이제 막바지네요 :)

제공해주신 샘플코드를 보면서도 코틀린이 코루틴을 어떻게 중단하는지는 이해가 잘 안되었습니다. 코드상(예제나 디컴파일된 코드)에 딱히 코루틴을 중단 시키는 부분이 보이지 않습니다.

재개의 경우 Continuation의 resumeWith 를 사용할것 같은데, 중단의 경우에는 내부적으로 CoroutineContext 가 활용되는 걸까요 ?

답변 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 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 성태혁님!

코루틴의 중단과 재개는 코루틴의 중요한 특징인데요. 쉽게 설명드리자면, 중단(suspend)은 코루틴이 실행을 일시적으로 멈추고, 이후에 작업이 준비되었을 때 다시 재개(resume)되는 것을 의미합니다.

코루틴이 중단되는 중단점은 보통 suspend 함수가 호출될 때 발생합니다. 이때 코루틴은 “어디까지 실행했는지”라는 상태를 저장하고, 더 이상 작업이 대기 중인 상태로 남아 있게 됩니다. 내부적으로 Continuation 인터페이스가 이러한 상태를 유지하는 데 사용됩니다. 코루틴을 처음 시작할 때에도 이 Continuation이 코드의 진전 상태를 추적합니다.

재개는 바로 이 ContinuationresumeWith 메서드를 통해 이루어집니다. 이를 통해 코루틴이 다시 실행되어 중단된 부분으로 돌아올 수 있게 됩니다. 중단의 메커니즘은 CoroutineContext를 이용하지 않고, 코틀린 컴파일러가 자동으로 생성하는 코드에 포함된 Continuation을 통해 이루어집니다.

이와 관련된 추가 내용이나 개념상 어려운 부분이 있다면, 기존 강의 게시판의 유사한 질문들을 참고하시면 좋습니다. 예를 들어:

  1. 코루틴의 대한 질문이 있습니다. - 코루틴의 동작 방식과 관련된 설명을 제공하는 게시물입니다.

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