관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[RxJava] 스케줄러 정리 본문

안드로이드/RxJava

[RxJava] 스케줄러 정리

막무가내막내 2020. 12. 30. 11:14
728x90

 

[2020.12.30 블로그 포스팅 스터디 다섯 번째 글]

 

[스케줄러] : 쉽게 설명하면 어떤 프로그램의 세부 일정(스케줄)을 주관하는 관리자로 생각하면 됩니다. 즉 스케줄러는 스레드를 지정할 수 있게 해주며 단순히 새로운 스레드를 생성해주고 어려운 비동기 흐름 관리를 쉽게 사용할 수 있도록 지원해주는 역할을 합니다.

 

 

 

RxJava를 보통 네트워크 통신에 처음 사용해보는 경우가 많습니다. 저 또한 그랬고요. 그리고 자연스럽게 subscribeOn() 과 observeOn() 도 접하게 됩니다.

 

이 두 함수도 스케줄러를 지정하는 함수인데요.

subscribeOn() 함수는 구독자가 Observable에 subscribe() 함수를 호출하여 구독할 때 실행되는 스레드를 지정합니다.

 

observeOn() 함수는 Observable에서 생성한 데이터 흐름이 여기저기 함수를 거치며 처리될 때 동작이 어느 스레드에서 일어나는지 지정할 수 있습니다. 

 

주의 : 만약 observeOn() 함수를 지정하지 않으면 subscribeOn() 함수로 지정한 스레드에서 모든 로직을 실행합니다. ㅎㅎ

 

 

 

이렇게 스레드를 분리함으로서 얻는 효과를 정리하면 다음과 같습니다.

 

1. 스케줄러 RxJava 코드를 어느 스레드에서 실행할지 지정할 수 있습니다. 
2. subscribeOn() 함수와 observeOn() 함수를 모두 지정하면 Observable에서 데이터 흐름이 발생하는 스레드와 처리된 결과를 구독자에게 발행하는 스레드를 분리할 수 있습니다.
3. subscribeOn() 함수만 호출하면 Observable의 모든 흐름이 동일한 스레드에서 실행됩니다.
4. 스케줄러를 별도로 지정하지 않으면 현재 메인 스레드에서 동작을 실행합니다.

 


 

 

이제는 RxJava2에서 제공하는 다양한  스케줄러에 대해 간략하게 살펴보겠습니다. ㅎㅎ

 

RxJava에서 추천하는 스케줄러가 크게 3가지가 있는데 계산(Computation), IO, 트램펄린입니다.

 

 

1. 뉴 스레드 스케줄러

이름에서 볼 수 있듯이 새로운 스레드를 생성합니다. 새로운 스레드를 만들어 어떤 동작을 실행하고 싶을 때 사용합니다.

 

 

2. 계산 스케줄러

계산 스케줄러는 CPU에 대응하는 계산용 스케줄러입니다. 계산 작업을 할 때는 대기 시간 없이 빠르게 결과를 도출하는 것이 중요한데 입출력(I/O) 작업을 하지 않는 스케줄러 역할을 합니다. 내부적으로 스레드 풀을 생성하며 스레드 개수는 기본적으로 프로세서 개수와 동일합니다.

 

 

3. IO 스케줄러

IO 스케줄러는 계산 스케줄러와는 다르게 네트워크상의 요청을 처리하거나 각종 입출력 작업을 실행하기 위한 스케줄러입니다. 계산 스케줄러와 다른 점은 기본으로 생성되는 스레드 개수가 다르다는 것입니다. 

계산 스케줄러는 CPU 개수만큼 스레드를 생성하지만 IO 스케줄러는 필요할 때마다 스레드를 계속 생성합니다. 입출력 작업은 비동기로 실행되지만 결과를 얻기까지 대기 시간이 깁니다.

즉 간략히 계산 <-> IO 스케줄러를 사용처를 비교하면

계산 스케줄러는 일반적인 계산 작업

IO 스케줄러는 네트워크상의 요청, 파일 입출력, DB 쿼리 등에 사용합니다.

 

 

 

4. 트램펄린 스케줄러

트램펄린 스케줄러는 새로운 스레드를 생성하지 않고 현재 스레드에 무한한 크기의 대기 행렬(큐)를 생성하는 스케줄러입니다.  처음보면 이게 뭔말이지 싶은 생각이 든다. 나도 그랬다. 그럴땐 밑 사이트 예제와 설명을 참고하면 된다. 첫 번째 사이트를 보고 스택오버플로우를 보기 추천합니다.

medium.com/@I_Love_Coding/rxjava-schedulers-trampoline-use-cases-283f6649cbf

 

RxJava Schedulers.trampoline() use cases

If you are a Reactive programmer, you should have seen that code many times:

medium.com

stackoverflow.com/questions/40233956/how-to-use-schedulers-trampoline-inrxjava/40235052

 

How to use Schedulers.trampoline() inRxJava

Since Schedulers.trampoline() makes the job work on the current thread, I cannot find the difference between the case with Schedulers.trampoline() and the case without Schedulers settings. Using

stackoverflow.com

 

 

 

5. 싱글 스레드 스케줄러

싱글 스레드 스케줄러는 RxJava 내부에서 단일 스레드를 별도로 생성하여 구독작업을 처리합니다. 생성된 스레드는 여러 번 구독 요청이 와도 공통으로 사용합니다. 잘 사용하지 않는 스케줄러이기 때문에 가볍게 넘어가도 될 것 같습니다.

 

 

이상 스케줄러에 대해 알아봤습니다.

 


[참고]

 

 

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!

728x90
Comments