Rx는 비동기 프로그래밍에 관한 것으로 어느 스레드에서 실행시킬지가 중요한 이슈이다.
스케줄러가 비동기 프로그래밍이 가능하도록 어느 스레드에서 실행을 시킬지를 결정하고, 관리를 하는 클래스이다.
스케줄러에서 기억해야할 할 함수는 아래 2가지 이다. subscribeOn()과 observeOn().
subscribeOn() | observeOn() |
- Observable (데이터 흐름) 이 발행되는 스레드 지정 - subscribe() 호출 시 실행되는 스레드 지정. |
- 처리된 결과를 전달하는 스레드 지정 - ObserveOn() 호출 이후부터 지정된 스레드에서 데이터흐름이 함수 수행 |
처음에 지정한 스레드로 고정 | 중간에 스레드 변경이 가능 (default: subscribeOn() 스레드) |
스케줄러의 종류에는 Schedulers 클래스에서 확인할 수 있듯이 총 5가지가 있다.
package io.reactivex.rxjava3.schedulers;
public final class Schedulers {
static final Scheduler SINGLE;
static final Scheduler COMPUTATION;
static final Scheduler IO;
static final Scheduler TRAMPOLINE;
static final Scheduler NEW_THREAD;
// ..
}
RxJava2와 종류는 같으며, Scheduler 의 패키지는 다른 것을 확인할 수 있다.
// RxJava2
package io.reactivex;
public abstract class Scheduler { }
// RxJava3
package io.reactivex.rxjava3.core;
public abstract class Scheduler { }
그러면 이제 표로 하나씩 알아보도록 하자.
종류 | 설명 | 언제 사용할 수 있을까 |
SINGLE Schedulers.single() |
구독 시, 단일 스레드를 공통으로 사용한다. (비동기 프로그래밍을 지향하는 Reactive에서 Single 스레드를 사용할 일 많지 않다.) |
여러번 구독 요청이 와도 동일한 스레드에서 실행을 시켜야 할 때 |
COMPUTATION Schedulers.computation() |
CPU 개수 (프로세서) 만큼 스레드를 생성하며, 대기시간 없이 빠른 결과를 도출한다. |
일반적인 계산/연산 작업이 필요할 때 |
IO Schedulers.io() |
필요할 때마다 스레드를 생성하며, 대기시간이 길다. |
API 요청, DB query, file I/O |
TRAMPOLINE Schedulers.trampoline() |
추가 스레드 생성하지 않는다는 특징이 있다. 현재 스레드에 무한한 크기로 큐(queue)를 생성하며, 따라서 실행순서가 유지된다. | 실행순서를 보장받아야 할 때 |
NEW_THREAD Schedulers.newThread() |
computation, io와 같이 역할이 지정되어있는 스레드들이 있기 때문에 특수한 경우에만 사용을 권장한다. |
_ |
스케줄러를 사용하게 되면, new Thread(), Callback 등과 같이 직접 스레드를 생성.관리하는 코드가 없어지기 때문에 가독성이 높아집니다.
또한, 여러 스레드에서 각각 지정된 함수를 실행시킬 수 있고, 이를 이전 포스팅에서 배운 operator 들을 활용하여 side-effect 없이 변환,결합등을 할 수 있게 됩니다.
참고
'RxJava' 카테고리의 다른 글
[RxJava3] ReactiveX 란? (0) | 2020.03.06 |
---|---|
[RxJava3] Reactive 연산자 - 2.필터 연산자, 결합 연산자 (0) | 2020.03.01 |
[RxJava3] Reactive 연산자 - 1.생성 연산자, 변환 연산자 (0) | 2020.02.27 |
[RxJava3] Observable (0) | 2020.02.26 |