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

HAHA님의 프로필 이미지
HAHA

작성한 질문수

2시간으로 끝내는 코루틴

7강. CoroutineScope과 CoroutineContext

CoroutineScope & Dispatcher 질문

해결된 질문

작성

·

52

0

안녕하세요.

제가 복습을 하다가 궁금한 부분이 생겨 질문드립니다.

 

section1 아래 코드를 다시 보니까 조금 혼란이 옵니다.


fun main(): Unit = runBlocking {
    val job1 = CoroutineScope(Dispatchers.Default).launch() {
        ...
    }
    
    val job2 = CoroutineScope(Dispatchers.Default).launch() {
        ...
    }
}

위 코드는 같은 Dispatchers.Default를 사용하는 것으로 보이는데,

질문.

두 CoroutineScope가 공통된 Dispatchers.Default를 공유하니까 한 코루틴에서 예외가 발생하면 다른 코루틴에서 예외가 발생할 것 같은데, 따로 처리되는 이유가 무엇인지 궁금합니다.

예를 들어, job1에 대한 CoroutineScope에서 예외가 발생하면 Dispatchers.Default에 job1에 대한 id를 주고, 해당 코루틴(ex. job1 내부 delay 상태로 된 내부 코루틴)에 대한 코루틴을 전부 지워라

이런 식으로 작동해서 독립적으로 실행되는건가요?

 

코루틴을 스레드에 배정하는 역할이 Dispatchers.Default, IO, Main 등이 있는데, 이름이 같은데 따로 예외처리되고 하니까 헷갈려서 질문드립니다.

 

제가 Dispatchers와 CoroutineScope 관계에 대해서 잘 이해를 못해서 또 이렇게 질문 올립니다..

 

감사합니다.

답변 2

1

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

안녕하세요 HANA님! 🙂 원래 멀티스레드 + non blocking 코드 자체가 눈에 보이지도 않고, 직관적인 동기 방식도 아니어서 봐도 봐도 헷갈리는 경우가 많더라고요!

질문 주신 내용에 대해 결론부터 말씀드리면 코루틴의 예외는 structured concurrency에 따라 부모 - 자식 간의 관계에만 영향을 끼치기 때문에 그렇습니다.

다만 보내주신 예시에서

  • runBlocking (부모 코루틴)

  • 첫 번째 launch (자식 코루틴이자 부모)

  • 두 번째 launch (자식 코루틴이자 부모)

으로 첫 번째 launch와 두 번째 launch가 서로 연관 있지 않나 라고 생각하실 수도 있는데

어쨌건 각 launch 입장에서는 서로가 독립적인 코루틴이고, runBlocking은 자식 코루틴에서 예외가 발생하더라도 모든 코루틴이 동작할 때까지 blocking 하는 속성이 있어 한 launch에서 예외가 발생한다고 해서 두 번째 launch까지 예외가 퍼지지는 않습니다.

 

코틀린의 예외 전파는 Dispatcher와는 무관하고 코루틴의 부모 - 자식 간의 관계에 영향을 받는다 라고 보시면 될 것 같아요! 🙂 관련한 내용은 5강~6강에서 한 번 더 확인해보실 수 있습니다!

 

감사합니다! 🙇

0

안녕하세요, 인프런 AI 인턴입니다. HAHA님.

코루틴과 디스패처의 관계에 대한 질문을 주셨네요. 관련된 질문과 답변이 몇 가지 있어서 링크를 통해 자세한 설명을 확인하실 수 있습니다.

  1. 코루틴 dispatcher IO관련 질문
    이 질문에서는 Dispatchers.IO를 사용하는 경우와 코루틴의 블록킹에 대해 설명하고 있습니다.

  2. Dispatchers 관련 궁금증입니다.
    이 질문에서도 Dispatchers의 역할과 동작을 이해하는 데 도움이 되는 내용이 포함되어 있습니다.

  3. delay 함수에 대해 질문이 있습니다
    delay 함수와 코루틴의 제어권 이전에 대해 설명하는 내용이 포함되어 있어, 코루틴이 어떻게 동작하는지 더 자세히 이해할 수 있습니다.

요약해서 설명드리자면:

  • Dispatchers.Default는 기본 디스패처로, 여러 코루틴이 이 디스패처를 공유하며 실행됩니다. 그러나 각각의 코루틴은 독립적으로 오류를 처리합니다.
  • 각 코루틴은 동일한 디스패처를 사용하더라도 예외 처리는 독립적으로 관리되기 때문에, 한 코루틴에서 발생한 예외가 다른 코루틴에 영향을 미치지 않습니다.
  • CoroutineScope 자체가 코루틴 빌더와 연결된 컨텍스트를 제공하며, 각각의 CoroutineScope는 자체적으로 관리됩니다. 즉, 예외가 발생하면 예외 처리기는 코루틴 스코프 내에서만 동작하며 다른 스코프에는 영향을 미치지 않습니다.

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

HAHA님의 프로필 이미지
HAHA

작성한 질문수

질문하기