스케줄러는 RxJava의 핵심이라고 말할 수도 있을 만큼 중요한 요소인데요.
어떤 프로그램의 세부 일정을 주관하는 관리자로 생각하면 이해하기 쉽습니다!
이제 RxJava의 종류에 대해서 알아보겠습니다!
[ RxJava 2.x 기준]
- 뉴 스레드 스케줄러 = newThread()
- 싱글 스레드 스케줄러 = single()
- 계산 스케줄러 = computation()
- IO 스케줄러 = io()
- 트램펄린 스케줄러 = trampoline()
이렇게 다섯가지로 구분할 수 있어요. 이제 각 스케줄러를 보다 구체적으로 알아볼게요!
아! 들어가기 전에 함께 자주 쓰이는 메소드 몇 개를 간단하게 알아볼게요. (다음 글들에서 자세히 다룰 예정입니다!)
- doOnNext(): Observable에서 onNext 이벤트가 발생하면 실행됩니다.
- subscribeOn(): 구독자가 Observable에 subscribe() 함수를 호출하여 구독할 때 실행되는 스레드를 지정합니다.
- observeOn(): Observable에서 생성한 데이터 흐름이 여기저기 함수를 거치며 처리될 때 동작이 어느 스레드에서 일어나는지 지정할 수 있습니다.
1. 뉴 스레드 스케줄러
이름 그대로 새로운 스레드를 생성하는 것입니다. 새로운 스레드를 만들어 어떤 동작을 실행하고 싶을 때 Schedulers.newThread()를 인자로 넣어주면 됩니다.
코드로 한 번 보겠습니다.
val args = arrayOf("1","2")
Observable.fromArray(args)
.doOnNext(it->"value1: $it")
.subscribeOn(Schedulers.newThread())
.subscribe(Log::i)
// result (메인 스레드가 아닙니다)
// 1
// 2
지금과 같은 동작을 수행할 때마다 새로운 스레드에서 작업이 수행됩니다!
하지만 이 뉴 스레드 스케줄러는 적극적으로 추천하는 방법이 아니에요. 왜냐, 뉴 스레드 스케줄러보다 활용도가 높은 계산 스케줄러, IO 스케줄러등이 있기 때문이죠
2. 계산 스케줄러
계산 스케줄러는 CPU에 대응하는 계산용스케줄러입니다. 계산 작업을 할 때는 대기 시간 없이 빠르게 결과를 도출하는 것이 중요합니다.
내부적으로 스레드 풀을 생성하며 스레드 개수는 기본적으로 프로세서 개수와 동일합니다.
실행 방법은 subscribeOn()의 인자로 Schedulers.computation()을 넣어주면 됩니다.
source.map(it-> it+1)
.subscribeOn(Schedulers.computation())
.subscribe(println(it))
ㅇ이런식으로요! interval() 함수도 적용시킬 수 있으니 한번 코딩해보시는걸 추천드립니다!
3. IO 스케줄러
IO 스케줄러는 계산 스케줄러와는 다르게 네트워크상의 요청을 처리하거나 각종 입 · 출력 작업을 위한 스케줄러입니다. 계산 스케줄러와 다른 점은 기본으로 생성되는 스레드 개수가 다르다는 것이죠!
즉, 계산 스케줄러는 cPU 개수만큼 스레드를 생성하지만 IO 스케줄러는 피룡할 때마다 스레드를 계속 생성합니다.
입 · 출력 작업은 비동기로 실행되지만 결과를 얻기까지 대기 시간이 깁니다.
- 계산 스케줄러: 일반적인 계산작업.
- IO 스케줄러: 네트워크상의 요청, 파일 입출력, DB 쿼리 등.
실행코드는 다음과 같습니다.
source.map(it.getAbsolutePath())
.subscribeOn(Schedulers.io())
.subscribe(println(it))
subscribeOn() 의 인자에 Schedulers.io()를 넣어주면 됩니다.
'gyub's 공부일기 > RxJava' 카테고리의 다른 글
[RxJava] RxAndroid 적용 예제 -1 (1) | 2020.11.16 |
---|---|
[RxJava] RxJava의 핵심 스케줄러 - 2 :트램펄린 스케줄러, 싱글 스레드 스케줄러, Executor 변환 스케줄러 (0) | 2020.11.14 |
[RxJava] 조건 연산자, amb(), takeUntil(other), skipUntil(other), all() (0) | 2020.11.08 |
[RxJava] 결합 연산자 zip(), combineLastest(),merge(), concat() (0) | 2020.11.06 |
[RxJava] 결합 연산자 zip(), combineLastest(),merge(), concat() (0) | 2020.11.06 |