Rx의 비동기 방식 및 Scheduler를 활용한 작업 처리는 Threading을 손쉽게 처리해준다는 점에서 매우 유용하지만, 잘못된 Scheduler를 사용하는 경우 피를 보게 될 여지가 분명하다.
금번에 피맛을 좀 본 뒤로 앞으로의 이슈를 방지하고자 다시금 Scheduler들을 리뷰하고 넘어가고자 한다!
1. IO
IO 스케줄러는 네이밍대로 네트워크 관련 작업이나 파일 시스템과의 상호작용시 사용하는 스케줄러이다.
자바의 Thread pool(작업을 기다리고 재사용되는 Worker thread 그룹)을 통해 구동되며, 기존 Thread가 재사용되지 못하는 조건에 있는 경우 새로운 Thread를 생성해 작업을 수행한다.
이 특징 때문에 경우에 따라 엄청난 양의 Thread를 만들 수 있고, 이로 인해 성능저하가 생길 수 있다는 단점이 있다.
(Thread는 60초 동안 사용되지 않았을 경우에 제거됨)
2. Computation
Computation 스케줄러도 동일하게 자바의 Thread pool을 이용하며, 특징은 디바이스의 CPU 코어 갯수만큼으로 스레드 수가 한정된다는 점이다(듀얼 코어라면 두 개, 쿼드라면 4개). 이는 경우에 따라 한정된 스레드들이 전부 바쁜 상태에 있는 경우 다음 작업을 진행하기 위해 대기를 해야 하는 상황이 생길 수 있다는 것이다. 참조한 포스트에서는 적은 양의 연산, 그리고 이를 빠르게 반영하고 싶은 경우 사용하는 것을 권장하고 있다.
3. NewThread
각 활성화 된 Observable을 따라 NewThread를 생성한다. 작업에 필요한 새로운 Thread를 생성하는 건 상당한 비용이 드는 작업이고 성능부하를 줄 수 있기 때문에 특별한 경우가 아니라면 사용을 지양하는 것을 권장한다.
4. Single
Observable의 갯수가 몇개가 되는지에 상관없이 단 하나의 Thread에서 작업을 수행하는 스케줄러이다.
5. Immediate
어떤 프로세스가 동작하고 있는지 여부에 상관없이 작업을 즉시 수행하는 스케줄러로 RxJava 2에서 삭제되었다.
6. Trampoline
트램폴린 Scheduler는 코드를 현재 Thread에서 수행한다. 고로 만약 Main Thread에서 코드를 돌리고 있었다면 코드블럭은 Main Thread의 Queue에 추가된다. Thread를 블록한다는 부분에서 Immediate Scheduler와 유사하나 차이점은 Thread에서 진행중이 ㄴ작업이 완전히 끝날 때까지 기다린다는 점이다. 여러 개의 Observable로부터 들어오는 흐름을 제어할 때 사용하는 것을 권장한다. (들어온 데이터를 순차적으로 처리하는 것을 보장)
7. Executor Scheduler
커스텀한 IO Scheduler라고도 말할 수 있으며, Thread pool의 사이즈를 직접 명시해 설정이 가능하다. IO Scheduler로 처리가 어려운, 다수의 입력을 처리하고자 할 때 사용하면 유용하다.
사용법은 executor를 우선 생성하고, scheduler를 Schedulers.from(executor)로 생성해 활용한다.
val executor = Executors.newFixedThreadPool(10)
val pooledScheduler = Schedulers.from(executor)
8. Android Scheduler
rxAndroid library를 통해 제공되는 Scheduler로 특정 동작을 UI thread에서 수행하도록 한다. 작업이 끝난 결과를 UI에 반영하고자 할 때 지정해주는 방식으로 사용한다.
* 본 포스팅은 Aanand Shekhar Roy 의 포스팅을 참조해 작성되었습니다.
'LANGUAGES, METHODLOGY > RxJava' 카테고리의 다른 글
[RxJava] 기술면접 대비 RxJava 정리하기 (0) | 2020.01.21 |
---|---|
[RxJava] RxJava 첫걸음. RxJava란 무엇인가? (0) | 2019.08.16 |