inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

2시간으로 끝내는 코루틴

4강. 코루틴의 취소

코루틴 dispatcher IO관련 질문

187

xeroman

작성한 질문수 4

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는 블락킹 당해도 괜찮을 수 있도록 어떤식으로 처리되어 있는 건지 궁금합니다.

 

kotlin coroutine

답변 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 당해도 괜찮을 수 있도록 어떤 처리가 되어 있는건지 궁금합니다]

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

 

 

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

감사합니다! 🙏

 

Dispatchers 별 차이점 관련 질문

0

91

1

코루틴과 가상 스레드의 차이가 궁금합니다.

1

307

2

Coroutine과 ThreadLocal관련 질문

0

152

2

선생님 강의를 듣고 크롤링에 코루틴을 적용해보고 있습니다. 그런데 코루틴이 하나만 나와서 동시처리가 안되는데 혹시 봐주실 수 있나요??

1

114

1

7강에 대해서 궁금증이 있는데요

1

116

2

Spring MVC에서 corountine 활용 방안

1

538

1

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

0

124

2

suspend 함수에 관해 추가적인 질문 있습니다! (runcatching, Result)

0

126

1

간단 질문.. join() vs delay()

0

157

2

코루틴을 잘 사용하고 있는지 궁금합니다.

0

196

1

CoroutineScope & Dispatcher 질문

0

160

2

async await 관련 질문

1

135

2

코루틴 실행 순서 궁금합니다.

1

231

2

corutine task에 대한 질문

1

195

2

completing의 존재의의가 궁금합니다.

1

161

1

Job 질문이 있습니다

1

203

1

스프링 MVC 환경에서의 코루틴

1

2093

1

자식1, 2와 부모코루틴의 관계

1

225

1

한 suspend fun 의 반환값이 다른 suspend fun의 파라미터로 쓰일 때

1

329

2

delay 함수에 대해 질문이 있습니다

1

392

1

runBlocking을 사용하는 경우가 있을까요?

0

399

1

delay가 없으면 실행 안 되는 이유

0

294

1

코루틴 스코프

0

312

1

CoroutineScope 와 withContext 의 차이를 잘 모르겠습니다.

1

699

1