해결된 질문
작성
·
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
을 바로 적용한다고 해도, 이미 설정된 환경을 우선시 하여 동작하게 됩니다.
관련하여 좀 더 자세한 설명이 담긴 게시물들을 참고로 하시면 도움이 될 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.