해결된 질문
작성
·
60
0
안녕하세요 강사님
Scheduler의 종류
강의를 수강하고 공부를 하던 와중에 newParallel
메서드에 대해서 궁금증이 생겨서 질문을 하게 됐습니다.
예제 코드에서는 newParallel
의 parallelism
변수 값을 4를 주셨는데 저는 3을 줘서 테스트를 해봤습니다.
해당 코드로 실행을 하면, 다음과 같은 로그가 나오게 됩니다.
public class SchedulersNewParallelExample01 {
public static void main(String[] args) {
Mono<Integer> flux =
Mono
.just(1)
.publishOn(Schedulers.newParallel("Parallel Thread", 3, true));
//쓰레드 할당
flux.subscribe(data -> {
TimeUtils.sleep(5000L);
Logger.onNext("subscribe 1", data);
});
//쓰레드 할당
flux.subscribe(data -> {
TimeUtils.sleep(4000L);
Logger.onNext("subscribe 2", data);
});
//쓰레드 할당
flux.subscribe(data -> {
TimeUtils.sleep(3000L);
Logger.onNext("subscribe 3", data);
});
//쓰레드 할당
flux.subscribe(data -> {
TimeUtils.sleep(2000L);
Logger.onNext("subscribe 4", data);
});
TimeUtils.sleep(8000L);
}
}
16:18:03.554 [Parallel Thread-3] INFO com.example.springwebflux.util.Logger -- # subscribe 3 onNext(): 1
16:18:04.548 [Parallel Thread-2] INFO com.example.springwebflux.util.Logger -- # subscribe 2 onNext(): 1
16:18:05.560 [Parallel Thread-1] INFO com.example.springwebflux.util.Logger -- # subscribe 1 onNext(): 1
16:18:07.561 [Parallel Thread-1] INFO com.example.springwebflux.util.Logger -- # subscribe 4 onNext(): 1
제가 여기서 여쭤보고 싶은 사항은 다음과 같습니다.
Round-Robin 방식을 통해서 각 쓰레드에 작업을 분배하고 더 많은 작업이 들어오면 각 쓰레드의 큐에 작업을 적재하는 것처럼 보이는데요.
작업들을 효율적으로 처리하기 위해서는 먼저 작업이 끝난 Parallel Thread-3에서 남아있는 작업을 가져가서 처리를 하면 좋을 것 같은데 [워크 스틸링(Work Stealing) 같은 처리]
Spring WebFlux에서는 해당 기능은 지원하지 않는 것인지 궁금합니다.
감사합니다
답변 2
1
안녕하세요.
Spring WebFlux에서 work-stealing 같은 처리를 지원하는지 질문 주셨는데요.
제가 알기로는 아래와 같이 ParallelFlux가 work-stealing 기능을 지원은 하는걸로 알고 있습니다.
다만, 작업을 가져가서 처리하는 work-stealing이라는 일반적인 의미와는 조금 다른 의미라고 생각해요.
리액티브 프로그래밍에서는 들어오는 데이터 즉, 데이터 스트림을 처리할 때 라운드 로빈 방식으로 데이터를 처리하는데 처리할 데이터를 미리 fetch(prefetch)해서 작업 효율성을 높일 수 있는데요.
이 prefetch하는 데이터의 양을 내부적으로 동적으로 조절해서 처리하는걸로 알고 있습니다.
한마디로 다른 쓰레드보다 들어오는 데이터를 더 빨리 처리하는 쓰레드는 데이터를 조금 더 많이 prefetch 해서 처리한다고 생각하시면 될 것 같습니다.
Spring WebFlux에서 이런 기능을 지원한다기 보다는 Reactor 같은 리액티브 프로그래밍 라이브러리에서 지원한다고 보시면 될 것 같아요.
0
안녕하세요, 인프런 AI 인턴입니다. denia park님.
Spring WebFlux에서 newParallel
메서드에 대한 궁금점이 있으시군요. 해당 메서드는 Schedulers
클래스의 일부로, 병렬 처리를 위한 새로운 스케줄러를 생성하는 데 사용됩니다. 입력한 parallelism
숫자에 따라 특정 개수의 쓰레드가 생성되고 작업이 라운드 로빈 방식으로 분배됩니다.
Schedulers
의 다양한 메커니즘에 대해 더 깊이 이해할 수 있는 답변을 참고할 수 있습니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.