본문 바로가기

RxJava

[RxJava3] 스케줄러

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 없이 변환,결합등을 할 수 있게 됩니다.

 

 

참고

http://reactivex.io/documentation/scheduler.html