ReactiveX 06 - 스케쥴러(Scheduler)

Posted by RoadtoS7 on April 23, 2020 · 2 mins read

6. 스케쥴러(Schduler)

Rx의 핵심 요소로서 Observable 만큼 중요하게 여겨지는 스케쥴러에 대해서 살펴보겠습니다.
스케쥴러는 어떤 프로그램의 세부일정을 관리하는 관리자로 생각하면 이해하기 쉽습니다.

6.1 스케쥴러 개념

지금까지 배운 개념들의 대부분은 동작이 현재(main) 스레드에서 이루어집니다.
하지만 때때로 작업을 비동기로 바꿀 때 스케쥴러를 사용합니다.

이렇듯 Observable의 연산자 체이닝에서 멀티 스레딩을 사용하고 싶으면, 체이닝된 연산자들 혹은 Observable이 특정한 스레드에서 동작하도록 지정하면됩니다.
스케쥴러는 이 스레드를 지정할 수 있게 해줍니다.
자바에서는 비동기프로그램을 할 때syncronized키워드 사용하거나 경쟁조건을 고려하게 되지만, Rx에서는 보다 간단하게 비동기 프로그램을 구현할 수 있습니다.

일부 Rx Observable 연산자들은 스케쥴러를 매개변수로 받을 수 있는 형태를 가지고 있습니다.
이 스케쥴러 매개변수를 지정하게 되면 연산자로 하여금 일부 작업 혹은 전체 작업을 특정한 스케쥴러에서 실행하도록 합니다.

기본적으로 이 매개변수를 지정하지 않는다면, Observable과 연산자 체인은, 작업이 이루어지는 스레드와 작업결과를 Observer에게 전달하는 스레드가 같습니다.
이 스레드는 subscribe 메소드가 호출된 스레드입니다.
정리하자면, 어디서 실행될 지 스케쥴러를 지정해주지 않는다면, subscribe 메소드가 호출된 스레드와, Observable과 연산자 체인의 작업이 이루어지는 스레드, 그리고 실행결과를 Observer에게 발행하는 스레드가 같습니다.

하지만 이 스케쥴러 지정을 통해서 실행되는 스레드를 변경할 수 있 있습니다. subscribeOn()을 통해서 Observable이 동작하는 스레드를 다르게 지정해줄 수 있습니다.
그리고 observeOn() 을 통해서 Observable이 Observer에게 아이템을 발행(알림을 전달)할 스레드를 다르게 지정해줄 수 있습니다.

아래의 마블 다이어그램을 통해서 observOn(), subscribeOn()에 대해서 더 자세히 살펴보겠습니다.

image

연산자 체인의 어느위치에서 subscribeOn이 실행되던지 간에, subscribeOn 연산자는 Observable이 어느 스레드에서 동작을 “시작”할지를 지정할 수 있습니다.
반면에 observeOn 연산자는 연산자 체인에서의 자신의 위치에 따라 Observable이 사용할 스레드에 영향을 줍니다.
이러한 이유로 우리는 연산자 체인의 일부가 어느 스레드에서 동작할지를 지정하기 위해서 observeOn 연산자를 연산자 체인의 여러곳에서 사용할 수 있습니다.

따라서 위 다이어그램에서 subscribeOn()을 통해서 파란색 스케쥴러를 지정했기 때문에, 맨 처음의 데이터 흐름이 파란색 스레드(화살표)에서 생성된 것을 확인할 수 있습니다.
즉, Observable이 파란색 스레드에서 동작을 시작했습니다.
첫번재 observeOn()을 통해서 주황색 스케쥴러를 지정했기 때문에, 이후의 연산자들은 주황색 스레드에서 실행이되다가, 두번째 observeOn()을 통해 핑크색 스케쥴러를 지정한 이후에는 연산자들은 핑크색 스레드 위에서 실행되는 것을 확인할 수 있습니다.