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

liltjay님의 프로필 이미지

작성한 질문수

코틀린 코루틴 완전 정복

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

공유 스레드풀에 대하여 질문 있습니다

작성

·

130

·

수정됨

1

안녕하세요.
1) "미리 정의된 CoroutineDispatcher - 1. Dispatchers.IO, Dispatchers.Default" 강의 중 마지막 부분에서 Dispatchers.IO와 Dispatchers.Default가 사용하는 스레드의 이름이 동일한 이유는 공유 스레드풀 때문이라고 하셨는데, 이 부분이 이해가 잘 가지 않습니다.

이것이 중요한 이유가 각각의 Dispatcher가 사용하는 스레드가 실제로는 다름에도 불구하고, 이름은 동일하기 때문에 헷갈리면 안되기 때문인가요? 제가 강조하신 부분을 잘 이해한건지 모르겠습니다.

2) LimitedParallelism은 코루틴 사용 시 모든 부분에 적용해야 하는 것인가요? 아니면 특정 경우에만 사용하면 되는 것인가요?

3) Code3-1~3-4를 실행할 때 어떤 때는 스레드 이름이 DefaultDispatcher-worker-1,2,3으로 뜨지만 또 어떤 때는 1,2,1 또는 1,2,4 또는 1,2,5 이런식으로 뜨는데 이유가 무엇인가요?

감사합니다!

답변 2

4

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

liltjay님 안녕하세요. 질문 남겨주셔서 감사합니다. 궁금하신 부분에 대해 답변 드립니다.

1) 미리 정의된 CoroutineDispatcher 중 IO 디스패처와 Default 디스패처는 공유 스레드풀을 사용하면서도 서로가 사용하는 스레드는 나눠져 있다는 것을 알려 드리기 위함이었습니다.
멀티스레드 프로그래밍을 할 때 사용되는 스레드가 어떤 스레드풀에서 생성되는지는지, 해당 스레드풀은 어떻게 동작하는지 이해하는 것은 매우 중요해서 이 부분을 설명에 넣었습니다.
2) limitedParallelism 함수를 IO 디스패처에 적용했을 때는 기존 IO 스레드의 개수에 영향을 받지 않는 별도의 스레드 집합을 사용하는 디스패쳐가 만들어집니다. 이런 디스패처는 다른 작업에 영향을 받지 않아야 하는 작업을 할 때 사용돼야 합니다.
limitedParallelism 함수를 Default 디스패처에 적용했을 때는 기존 Default 디스패처의 스레드들 중 일부를 제한적으로 사용하는 디스패처가 만들어집니다. 이런 디스패처는 특정 작업이 모든 스레드를 사용하는 것을 방지해야 할 때 사용됩니다.
즉 limitedParallism 함수는 위와 같이 매우 특별한 상황에만 사용되며, 대부분의 경우에는 Dispatcher.IO나 Dispatchers.Default만 사용해도 문제가 없습니다.
3) IO 디스패처에 코루틴이 실행 요청되면 스레드가 부족하다고 판단될 경우 스레드가 생성되는데요. 이때 부족한 개수 만큼만 생성되는 것이 아니라 일부 여유를 두고 생성한 다음 해당 스레드들 중 하나에 코루틴을 보내는 것으로 알고 있습니다. 따라서 코루틴을 3개만 실행 요청하더라도 5개가 생성될 수 있고, 4개만 실행 요청하더라도 7개가 생성될 수 있습니다.
5,2,1 이나 1,2,4 같이 분배 되는 이유는 이렇게 생성된 스레드 중 하나에 코루틴이 보내지기 때문입니다.
Executor 프레임웍도 스레드 생성과 관련된 내부 구현이 계속 바꼈고, 이 부분도 코루틴 라이브러리 내부의 최적화 정책에 따라 달라질 수 있어서 이 정도까지만 답변 드리는 것을 양해 부탁드리겠습니다.

좋은 질문 남겨주셔서 감사합니다! 답변이 도움이 되었으면 좋을 것 같습니다. 좋은 하루 되세요.

0

저도 책을 보면서 1번 너무 궁금했습니다. 같은 질문을 주신 분이 계셨네요. 인프런에 강의가 생겨서 너무 좋네요. 두 Dispatcher가 쓰레드 이름이 같게 출력되서 정말 헷갈렸습니다.

liltjay님의 프로필 이미지

작성한 질문수

질문하기