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

xeroman님의 프로필 이미지
xeroman

작성한 질문수

2시간으로 끝내는 코루틴

4강. 코루틴의 취소

코루틴 dispatcher IO관련 질문

작성

·

83

·

수정됨

0

안녕하세요 강사님? 강의 잘 듣고 있습니다.
듣다보니 몇가지 궁금증이 생겨서 질문드립니다. 너무 쉬운 질문들도 있겠지만, 선생님의 답변을 통해 확신을 얻고 싶은 마음이 있어 질문드립니다 __)

  1. 동기적 호출을 전제하는 동작, 예를 들 FeignClient기반의 호출을 다른 스레드(DISPATCHER.IO)에위임하지 않고 기존 스레드에서만 코루틴형태로 동작시키면, 이때에도 여전히 의도와 다르게 블락킹될 것 같은데 맞을까요? 강의에서 보여주신 예시중에 아래와같은 예시가 있는데, 이 경우에는 하나의 스레드만 사용하시는 것 같아 혹시나 하는 마음에 여쭤봅니다.

     

     

// Async 사용
fun main(): Unit = runBlocking {
    val time = measureTimeMillis {
        val job1 = async { apiCall1() }
        val job2 = async { apiCall2() }
        printWithThread(job1.await() + job2.await())
    }
    printWithThread("소요시간 : $time")
}
// 출력 결과
[main] 소요시간 : 1030

 

  1. IO를 효율적으로 진행하기 위해서는 결국 Dispatcher I.O의 스레드들에게 위임해야 할 것 같은데그렇다면 애초부터 Dispatcher I.O의 스레드들은 ‘블락킹당해도 괜찮다’를 전제로 만들어진 스레드들(스레드풀)인걸까요?

  2. 그러면 결론적으로 Dispatcher IO는 블락킹 당해도 괜찮을 수 있도록 어떤식으로 처리되어 있는 건지 궁금합니다.

 

답변 1

0

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

안녕하세요! xeroman님! 🙂 아이고~ 그 어떤 질문을 남겨주셔도 좋아요~ 하나씩 답변 드려 보겠습니다.

 

[1. 하나의 스레드만 사용할 경우 의도와 다르게 blocking 되는게 맞을까요?]

보여주신 코드에서 apiCall1()apiCall2() 이 "스레드를 blocking" 하는 I/O를 발생시키고

해당 코루틴이 하나의 스레드에서만 동작한다면, 결국 스레드는 하나이기 때문에 1초가 아닌 2초가 소요되는 것이 맞습니다!

그래서 1초가 걸린 예제에서는 스레드를 blocking 하지 않은 delay() 를 사용했을거에요! 🙂

 

[2. 결국 IO를 효율적으로 진행하려면 Dispatchers.IO의 스레드에게 위임해야 할 것 같은데 Dispatchers.IO는 blocking 당해도 괜찮나요?]

blocking 당해도 괜찮다 라는 의미가 살짝 모호하지만, 아마 궁금하신 부분은

"Dispatchers.IO의 스레드는 blocking 당하지 않는가? 일 것 같아요!

이에 대해 말씀드리면 Dispatchers.IO의 스레드도 blocking을 당합니다.

단지 이런 스레드를 관리할 때에 Network I/O가 발생함을 가정하고 여러 스케쥴링이나, 스레드풀 관리 작업이 약간 더 최적화 되어 있을 뿐 근본적으로 blocking 해야 하는 I/O가 발생하면 특정 스레드가 blocking 되는 것은 어쩔 수 없습니다.

이런 경우는 차라리 JVM의 가상 스레드를 사용하면 조금 더 나을 수 있어요! 🙂

 

[3. Dispatchers IO는 blocking 당해도 괜찮을 수 있도록 어떤 처리가 되어 있는건지 궁금합니다]

위에서 말씀드린 것처럼 다른 스레드와 크게 차이가 있지는 않다고 알고 있습니다.

 

 

답변이 도움이 되었으면 좋겠네요! 또 궁금한 부분 있으시면 편하게 질문 남겨주세요.

감사합니다! 🙏

 

xeroman님의 프로필 이미지
xeroman

작성한 질문수

질문하기