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

azsxd34님의 프로필 이미지
azsxd34

작성한 질문수

코틀린 코루틴 완전 정복

미리 정의된 CoroutineDispatcher - 2. 공유 스레드풀과 limitedParallelism

Code3-6에서 imageProcessingDispatcher가 inline으로는 동작하지 않는 이유가 궁금합니다

해결된 질문

작성

·

26

1

안녕하세요.

 

기초적인 질문 같지만, 코루틴을 처음 사용하는 입장에서 imageProcessingDispatcher를 인라인으로 넣을 수 없는 이유가 궁금합니다.

직접 테스트했을 때,

launch(Dispatchers.Default.limitedParallelism(2)) {
  //...
}

와 같은 코드는 예상한대로 동작하지 않고, 머신 processor만큼을 사용하는 것으로 보이는데, 그 이유가 뭘까요?

답변 2

1

조세영님의 프로필 이미지
조세영
지식공유자

azsxd34님 안녕하세요. 지식 공유자 조세영입니다.

다음 코드에서 Dispatchers.Default.limitedParallelism(2) 가 repeat 블록 안(launch 함수의 인자)으로 들어갈 경우 repeat 블록이 반복될 때마다 Dispatchers.Default.limitedParallelism(2)가 새로 생성되서 그렇습니다. 즉, Dispatchers.Default.limitedParallelism(2)을 repeat 블록 안에 넣으면 Dispatchers.Default.limitedParallelism(2)가 1000개 생성됩니다.

fun main() = runBlocking<Unit> {

    val imageProcessingDispatcher = Dispatchers.Default.limitedParallelism(2)

    repeat(1000) {

        launch(imageProcessingDispatcher) {

            Thread.sleep(1000L) // 이미지 처리 작업

            println("[${Thread.currentThread().name}] 이미지 처리 완료")

        }

    }

}

 

답변이 도움이 되면 좋을 것 같습니다!

감사합니다.

 

0

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

질문해주신 내용에 대해 답변드리겠습니다.

코틀린 코루틴에서 limitedParallelism을 사용하여 코루틴의 동시 실행 개수를 제한하고자 할 때, 이 함수가 인라인으로 동작하지 않는 이유는 몇 가지가 있습니다. limitedParallelism은 디스패처의 동시 실행을 제한하는 역할을 하지만, 이는 특정한 스레드풀에 대한 설정을 생성하는 방법이 필요하고, 인라인은 이러한 새로운 디스패치 설정을 포함하지 않기 때문입니다.

스레드풀의 최대 동시 작업 수를 설정하기 위해 limitedParallelism을 사용할 수 있지만, 이를 사용하는 전달된 디스패처가 이미 존재하는 작업들을 최적화된 방식으로 처리하기 때문에, 새로운 설정으로 생성된 디스패처를 사용하지 않으면 인라인 형태로는 제대로 적용되지 않습니다.

또한, Dispatchers.Default는 코루틴이 실행될 때, 해당 디스패처를 사용하여 프로세서의 적절한 수를 자동으로 계산하여 스레드 개수를 설정하므로, 한번 설정된 Dispatchers.Default에 인라인으로 limitedParallelism을 바로 적용한다고 해도, 이미 설정된 환경을 우선시 하여 동작하게 됩니다.

관련하여 좀 더 자세한 설명이 담긴 게시물들을 참고로 하시면 도움이 될 수 있습니다:

  1. 코루틴 디스패처와 스레드풀 이해하기
  2. 코루틴과 스레드 관련 질의

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

azsxd34님의 프로필 이미지
azsxd34

작성한 질문수

질문하기