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

비가싫어요님의 프로필 이미지
비가싫어요

작성한 질문수

2시간으로 끝내는 코루틴

1강. 루틴과 코루틴

yield 함수가 없어도 결과가 동일한 이유가 뭔가요?

해결된 질문

작성

·

383

1

yield 함수를 지워도 실행을 했을 때 출력 순서가 동일한 이유가 궁금합니다!

runBlocking 으로 실행한 코루틴과 launch 로 실행한 코루틴의 순서가 변경됐던 이유가 yield 때문이 아니기 때문일까요?

답변 1

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 파이팅해야지님! 질문 주셔서 감사합니다! 🙂

 

핵심 적인 부분은 yield() 2개를 동시에 지운다는 점이에요!

fun main(): Unit = runBlocking {
  println("START")
  launch {
    newRoutine()
  }
  yield() // 1번, yield를 제거한다면?!
  println("END")
}

suspend fun newRoutine() {
  val num1 = 1
  val num2 = 2
  yield() // 2번, yield를 제거한다면?!
  println("${num1 + num2}")
}

이 경우는 다음과 같이 동작합니다.

  1. main 함수가 실행되고

  2. launch를 이용해 새로운 코루틴이 시작! (되었으나 해당 코루틴이 즉시 실행되지는 않는다)

  3. 따라서 launch 아래의 1번 yield로 넘어옴

  4. yield에 의해 main 루틴이 실행을 new 루틴에게 양보

  5. newRoutine 함수로 넘어와 변수 선언 이후 다시 2번 yield가 실행

  6. yield에 의해 다시 main 루틴으로 넘어와 END 출력

  7. main 루틴이 종료되었으므로 newRoutine으로 넘어와 println 출력

 

그리고 yield()를 함께 지우면 아래와 같은 코드가 되는데요!

fun main(): Unit = runBlocking {
  println("START")
  // 새로운 코루틴 시작!
  launch {
    newRoutine()
  }
  println("END")
}

suspend fun newRoutine() {
  val num1 = 1
  val num2 = 2
  println("${num1 + num2}")
}

이때 새로운 코루틴을 launch로 시작한다고 해서 반드시 해당 코루틴이 먼저 실행되는게 아닙니다.

따라서 이 경우는 아래와 같이 동작합니다!

  1. main 함수가 실행되고

  2. launch를 이용해 새로운 코루틴이 시작! (되었으나 해당 코루틴이 즉시 실행되지는 않는다)

  3. 따라서 main 함수의 END를 출력

     

  4. main 루틴이 종료되었으므로 newRoutine으로 넘어와 println 출력

 

답변이 도움이 되었으면 좋겠습니다. 감사합니다!! 🙇

아 yield 함수가 없으면 그냥 처음 시작된 코루틴을 그대로 진행하고 그게 끝나면 도중에 시작된 코루틴이 이어서 시작되는거군요! 친절한 답변 감사드립니다^^

비가싫어요님의 프로필 이미지
비가싫어요

작성한 질문수

질문하기