Rx Scheduler -6-

Cloud0·2021년 9월 16일
0
post-thumbnail

Scheduler


Observable 연산자 체인에 멀티스레딩을 적용하고 싶다면, 특정 스케줄러를 사용해서 연산자(또는 특정 Observable)를 실행하면 된다.

ReactiveX의 일부 Observable 연산자는 사용할 스케줄러를 파라미터로 전달 받기도 하는데, 이 연산자들은 자신이 처리할 연산의 일부 또는 전체를 전달된 스케줄러 내에서 실행한다.

기본적으로, Observable과 연산자 체인은 이처럼 스케줄러를 통해 동작하고 Subscribe 메서드가 호출되는 스레드를 사용해서 옵저버에게 알림을 보낸다. SubscribeOn 연산자는 다른 스케줄러를 지정해서 Observable이 처리해야 할 연산자들을 실행 시킨다. 그리고, ObserveOn 연산자는 Observable이 옵저버에게 알림을 보낼때 사용 할 스케줄러를 명시한다.

아래 그림이 보여주듯, SubscribeOn 연산자는 Observable이 연산을 위해 사용할 스레드를 지정하며, 연산자 체인 중 아무 곳에서 호출해도 문제되지 않는다. 하지만, ObserveOn 연산자는 연산자 체인 중 Observable이 사용할 스레드가 호출 체인 중 어느 시점에서 할당되는지에 따라 그 후에 호출되는 연산자는 영향을 받는다. 그렇기 때문에, 어쩌면 여러분은 특정 연산자를 별도의 스레드에서 실행 시키기 위해 연산자 체인 중 한 군데 이상에서ObserveOn을 호출하게 될 것이다.

Scheduler 종류


스케줄러는 RxJava의 Schedulers 클래스의 정적 팩토리 메소드를 통해 생성할 수 있으며 총 5개의 스케줄러가 존재한다.
Rx에서 추천하는 3가지 스케줄러 계산(Computation) 스케줄러 / 2. IO 스케줄러 / 3. 트램펄린 스케줄러, 스레드 스케줄러나 다른 스케줄러는 특수한 상황에서 적용하길 권장

  • COMPUTATION

    • Computation 스레드 스케줄러는 CPU에 대응하는 계산용 스케줄러이다.
    • IO 작업을 하지 않고 일반적인 계산/연산 작업을 할 때 사용한다.
    • 내부적으로 스레드 풀을 생성하고 생성된 스레드를 이용한다. 기본적으로 스레드의 개수는 프로세서의 개수와 같다.
  • IO

    • 파일 입출력 등의 IO 작업을 하거나 네트워크 요청(파일 입출력, DB 쿼리 등) 처리 시에 사용하는 스케줄러이다.
    • Computation 스케줄러와 다르게 필요할 때마다 스레드를 계속 생성한다.
      -> 즉, 계산 스케줄러는 CPU 개수만큼 스레드를 생성하지만, IO 스케줄러는 필요할 때마다 스레드를 계속 생성함.
  • TRAMPOLINE

    • 트램펄린 스케줄러는 새로운 스레드를 생성하지 않고 사용하고 있는 현재 스레드에 무한한 크기의 대기 큐를 생성한다.
    • 새로운 스레드 생성하지 않는 것과 대기 행렬을 자동으로 만들어 준다는 것이 뉴 스레드, 계산, IO 스케줄러와 다르다.
  • SINGLE

    • Single 스레드 스케줄러는 단일 스레드를 계속 재사용한다.
    • 내부에서 단일 스레드를 별도로 생성하여 구독(subscribe) 작업을 처리, 한 번 생성된 스레드로 여러 작업을 처리한다.
    • 리액티브 프로그래밍이 비동기 프로그래밍을 지향하기 때문에 싱글 스레드 스케줄러를 활용할 확률은 낮다.
  • NEW_THREAD
    • 새로운 스레드 생성
    • 새로운 스레드를 만들어 어떤 동작을 실행하고 싶을 때 Schedulers.newThread() 를 인자로 넣어주면 됨.그럼 뉴 스레드 스케줄러는 요청을 받을 때마다 새로운 스레드 생성

    REFERENCE

  • ReactiveX
  • 태임태임
profile
이...사...중......

0개의 댓글