작성
·
83
·
수정됨
0
안녕하세요 강사님? 강의 잘 듣고 있습니다.
듣다보니 몇가지 궁금증이 생겨서 질문드립니다. 너무 쉬운 질문들도 있겠지만, 선생님의 답변을 통해 확신을 얻고 싶은 마음이 있어 질문드립니다 __)
동기적 호출을 전제하는 동작, 예를 들 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
IO를 효율적으로 진행하기 위해서는 결국 Dispatcher I.O의 스레드들에게 위임해야 할 것 같은데그렇다면 애초부터 Dispatcher I.O의 스레드들은 ‘블락킹당해도 괜찮다’를 전제로 만들어진 스레드들(스레드풀)인걸까요?
그러면 결론적으로 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 당해도 괜찮을 수 있도록 어떤 처리가 되어 있는건지 궁금합니다]
위에서 말씀드린 것처럼 다른 스레드와 크게 차이가 있지는 않다고 알고 있습니다.
답변이 도움이 되었으면 좋겠네요! 또 궁금한 부분 있으시면 편하게 질문 남겨주세요.
감사합니다! 🙏