TIL

parallelStream()

하얀잔디 2022. 10. 20. 17:47

채팅 서비스 중 마주한 코드

위 코드는 채팅을 구현하다가 구글에서 마주친 코드이다.

각 세션에게 바로 메세지를 보낸다. ?? stream은 알겠는데 parallel은 뭐지?? 하고 찾아봤는데,

 

병렬로 빠르게 처리하는 stream이다.

 

 

 

우선 Stream을 왜 쓰냐? for문이 있는데..

 

->외부 반복과 내부 반복의 차이이다.

Collection 데이터를 가공할때 직접적으로 반복문을 쓰며 로직을 작성 -> 외부 반복

Stream : 내부적으로 반복문 -> 로직만 작성하면 알아서 처리.

 

 

그래서 stream 장점이 뭔데?

1. 병렬 처리에 유리함.

2. stream은 람다식을 사용해 별도의 스레드에서 병렬처리를 관리함.

 

Fork/ join 의 work 쓰레드의 수는 

서비스가 돌아가는 서버의 CPU 코어 수에 종속적임.

 

서버의 코어 PC의 수가 4개면 4개의 쓰레드임.

 

-> 그래서 만약 4개를 동시에 하면 1개 한만큼의 시간이지만 5개를  하면 2개한만큼의 시간이 나타남.

 

가장 큰 문제 :

 

ThreadPool을 Global 하게 이용함

 

그러므로

 

위와같이 쓰레드를 모두 가져가서 sleep 같은 함수를 실행해버리면 문제가 발생함.

 

이러한 문제는 ForkJoinPool을 커스텀하면서 해결할 수 있음.

 

https://sabarada.tistory.com/102

 

[java8] 병렬 Stream

Java에서는 다양한 방법으로 병렬 처리를 만들 수 있습니다. 기본적인 Thread 클래스를 이용할 수 있으며, ExecutorService 를 이용하여 쓰레드풀도 쉽게 만들 수 있습니다. 그리고 CompleteFuture 를 이용하

sabarada.tistory.com

 

어우 어렵다.. 정리하자면

 

Stream은 내부반복을 지원해서 병렬처리가 쉽게 가능하다.

각 stream끼리는 같은 쓰레드풀을 사용한다 -> 관리가 필요하다.

 

 

하지만 ParallelStream이 항상 빠르다고 할 수 없다. 상황에 따라 또 다른것같다.

 

아래는 For / Stream / ParallelStream 비교표다.

]\