본문 바로가기
Rx

스케줄러 -3( IO스케줄러 )

by 봄석 2018. 12. 27.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=


저자님의 블로그

https://brunch.co.kr/@yudong#info




RxJava의 버전별 스케줄러 종류

스케줄러 

RxJava 2.x 

RxJava 1.x 

  뉴 스레드 스케줄러

newThread()

 newThread()

 싱글 스레드 스케줄러

single() 

지원 안 함 

계산 스케줄러 

computation() 

computation() 

IO 스케줄러 

io() 

io() 

트램펄린 스케줄러 

trampoline() 

trampoline() 

메인 스레드 스케줄러 

지원 안 함 

im 

 테스트 스케줄러

지원 안 함 

test() 


스케줄러 동작 방법

1. 스케줄러는 RxJava 코드를 어느 스레드에서 실행할지 지정할 수 있다.

2. subscribeOn() 함수와 observeOn() 함수를 모두 지정하면 Observable에서 데이터 흐름이 

발생하는 스레드와 처리된 결과를 구독자에게 발행하는 스레드를 분리할 수 있다.

3. subscribeOn() 함수만 호출하면 Observable의 모든 흐름이 동일한 스레드에서 실행된다.

4. 스케줄러를 별도로 지정하지 않으면 현재(main)스레드에서 동작을 실행한다




IO 스케줄러

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


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


두 스케줄러를 비교한다면 다음과 같습니다

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

-  IO 스케줄러 :  네트워크상의 요청, 파일 입출력, DB쿼리 등


여기서는 파일 입출력에 관한 예제로 IO스케줄러의 활용법을 알아보겠습니다.


파일 입출력 IO 스케줄러 예시

//C 드라이브 루트 디렉터리에 파일 목록 생성
String root="C:\\";
File[] files=new File(root).listFiles();
Observable<String> source= Observable.fromArray(files)
            .filter(f->!f.isDirectory())
            .map(f->f.getAbsolutePath())
            .subscribeOn(Schedulers.io());
        
source.subscribe(Log::i);

 CommonUtils.sleep(500);


root 변수는 C드라이브 루트 디렉터리를 의미합니다. 해당 결로의 File 객체를 생성하여 listFiles() 메소드를 호출하면 파일 목록을 File[] 배열로 리턴합니다. 파일 중에 디렉터리는 제외하고 파일들만 필터링합니다.


source 변수는 File[] 배열에 있는 파일의 절대 경로를 발행하는 Observable 입니다. 

IO 스케줄러에서 실행됩니다.


실행 결과

RxCachedThreadScheduler-1 | value = C:\.rnd
RxCachedThreadScheduler-1 | value = C:\Adobe Photoshop CC 2015.1.2 Portable.exe
RxCachedThreadScheduler-1 | value = C:\agentlog.txt
RxCachedThreadScheduler-1 | value = C:\AVScanner.ini
RxCachedThreadScheduler-1 | value = C:\bootmgr
RxCachedThreadScheduler-1 | value = C:\BOOTNXT
RxCachedThreadScheduler-1 | value = C:\end
RxCachedThreadScheduler-1 | value = C:\eula.1028.txt
RxCachedThreadScheduler-1 | value = C:\eula.1031.txt
RxCachedThreadScheduler-1 | value = C:\eula.1033.txt
RxCachedThreadScheduler-1 | value = C:\eula.1036.txt
RxCachedThreadScheduler-1 | value = C:\eula.1040.txt
RxCachedThreadScheduler-1 | value = C:\eula.1041.txt
RxCachedThreadScheduler-1 | value = C:\eula.1042.txt
RxCachedThreadScheduler-1 | value = C:\eula.2052.txt
RxCachedThreadScheduler-1 | value = C:\eula.3082.txt
RxCachedThreadScheduler-1 | value = C:\globdata.ini
RxCachedThreadScheduler-1 | value = C:\hiberfil.sys
RxCachedThreadScheduler-1 | value = C:\install.exe
RxCachedThreadScheduler-1 | value = C:\install.ini
RxCachedThreadScheduler-1 | value = C:\install.res.1028.dll
RxCachedThreadScheduler-1 | value = C:\install.res.1031.dll
RxCachedThreadScheduler-1 | value = C:\install.res.1033.dll
RxCachedThreadScheduler-1 | value = C:\install.res.1036.dll
RxCachedThreadScheduler-1 | value = C:\install.res.1040.dll
RxCachedThreadScheduler-1 | value = C:\install.res.1041.dll
RxCachedThreadScheduler-1 | value = C:\install.res.1042.dll
RxCachedThreadScheduler-1 | value = C:\install.res.2052.dll
RxCachedThreadScheduler-1 | value = C:\install.res.3082.dll
RxCachedThreadScheduler-1 | value = C:\msdia80.dll
RxCachedThreadScheduler-1 | value = C:\pagefile.sys
RxCachedThreadScheduler-1 | value = C:\rhdsetup.log
RxCachedThreadScheduler-1 | value = C:\setup.log
RxCachedThreadScheduler-1 | value = C:\swapfile.sys
RxCachedThreadScheduler-1 | value = C:\vcredist.bmp
RxCachedThreadScheduler-1 | value = C:\VC_RED.cab

RxCachedThreadScheduler-1 | value = C:\VC_RED.MSI



댓글