RxJava 스케줄러의 사용 사례
RxJava에는 다음 중 선택할 수 있는 5개의 다른 스케줄러가 있다.
즉시(): 현재 스레드에서 작업을 즉시 실행하는 스케줄러 작성 및 반환
trampoline(): 현재 작업이 완료된 후 실행할 현재 스레드에서 대기열이 작동하는 스케줄러 작성 및 반환
Newthread(): 각 작업 단위에 대해 새 스레드를 만드는 스케줄러 작성 및 반환
계산(): 계산 작업을 위한 스케줄러 작성 및 반환이것은 이벤트 루프, 콜백 처리 및 기타 계산 작업에 사용될 수 있다.이 스케줄러에서 입출력 바인딩 작업을 수행하지 마십시오.대신 Schedulers.io를 사용하십시오.
io(): IO 바인딩 작업을 위한 스케줄러 생성 및 반환구현은 필요에 따라 확장되는 실행자 스레드 풀에 의해 지원된다.이는 비동기적으로 수행되는 차단 IO에 사용할 수 있다.이 스케줄러에서 계산 작업을 수행하지 마십시오.대신 Scheduler.computation()을 사용하십시오.
질문:
처음 3개의 스케줄러는 꽤 자기주석이 있다. 그러나 나는 계산과 계산에 대해 조금 혼란스럽다.
- 가IO-bound work"가 정확히 무엇인가?스트림 처리에 사용되는가 (?
java.io
) 및 파일(java.nio.files
데이터베이스 질의에 사용되는가?파일을 다운로드하거나 REST API에 액세스하는 데 사용되는가? - 계산()과 newThread()는 어떻게 다른가?모든 계산() 호출이 매번 새(백그라운드) 스레드가 아닌 단일(백그라운드) 스레드에 있는 것인가?
- IO 작업을 할 때 연산()을 호출하는 것이 나쁜 이유는?
- 컴퓨터 작업을 할 때 io()를 호출하는 것이 왜 나쁜가?
좋은 질문이야, 설명서가 좀 더 자세히 설명해주면 될 것 같아.
io()
바인딩되지 않은 스레드 풀로 백업되며, CPU에 많은 부하를 주지 않는 비컴퓨팅 집약적인 작업에 사용할 수 있다.따라서 yep와 파일 시스템 간의 상호 작용, 다른 호스트의 데이터베이스 또는 서비스와의 상호 작용이 좋은 예다.computation()
사용 가능한 프로세서 수와 동일한 크기를 가진 경계 스레드 풀로 백업된다.사용 가능한 프로세서보다 더 많은 프로세서에 걸쳐 CPU 집약적인 작업을 병렬로 예약하려는 경우(예: 사용)newThread()
스레드 생성 오버헤드 및 컨텍스트 전환 오버헤드를 프로세서에 대한 스레드 vie로 사용할 경우 잠재적으로 큰 성능 히트를 칠 수 있다.- 떠나는 것이 상책이다.
computation()
CPU 집약적인 작업에만 해당하지 않으면 CPU 활용률이 높지 않을 것이다. - 전화하는 것은 나쁘다.
io()
.io()
무제한이며, 만약 당신이 수천개의 컴퓨터 작업을 계획한다면io()
동시에 이러한 수천 개의 작업 각각은 각각 고유한 스레드를 가질 것이며 CPU가 컨텍스트 스위칭 비용을 발생시키기 위해 경쟁할 것이다.
가장 중요한 점은 Schedulers.io과 Scheduler.computation 모두 이 질문에 언급된 다른 것과 달리 바인딩되지 않은 스레드 풀에 의해 지원된다는 것이다.이 특성은 실행자가 newCacheThreadPool(자동 재청구 스레드 풀로 바인딩되지 않음)으로 생성된 경우 Schedulers.from(Executor)에서만 공유된다.
Schedulers.io과 Schedulers.computation은 이전 답변과 웹상의 여러 기사에서 풍부하게 설명한 바와 같이, 이름 그대로 업무의 종류에 최적화되어 있어 신중하게 사용한다.하지만, 내 관점에서, 그것들은 반응하는 흐름에 실질적인 동시성을 제공하는 것이 가장 중요한 역할이다.
새로운 믿음과는 반대로, 반응하는 스트림은 본질적으로 동시성이 아니라 본질적으로 비동기적이고 순차적이다.바로 이러한 이유로 인해 Schedulers.io은 I/O 작업이 차단되고 있을 때(예: Apache IOUtils FileUtils.readFileAsString(...)과 같은 차단 명령을 사용할 때)에만 사용되므로 작업이 완료될 때까지 호출 스레드가 동결된다.
Java AsynchronousFileChannel(...)과 같은 비동기식 방법을 사용하면 작업 중에 호출 스레드를 차단하지 않으므로 별도의 스레드를 사용할 필요가 없다.사실, Schedulers.io 스레드는 이벤트 루프를 실행하지 않고 콜백도 결코...부름을 받다
데이터베이스 접속이나 원격 API 호출에도 같은 논리가 적용된다.비동기식 또는 대응식 API를 사용하여 전화를 걸 수 있는 경우 Schedulers.io을 사용하지 마십시오.
다시 동시성으로 돌아간다.당신은 I/O 작업을 비동기적이거나 동시에 하기 위해 비동기적이거나 반응적인 API에 접근할 수 없을 수 있으므로, 당신의 유일한 대안은 별도의 스레드에 여러 통화를 보내는 것이다.아아, 반응형 스트림은 그 끝에는 순차적이지만, 좋은 소식은 플랫맵() 사업자가 핵심에 동시성을 도입할 수 있다는 것이다.
일반적으로 플랫맵() 연산자를 사용하여 스트림 구조에 동시성을 구축해야 한다.이 강력한 연산자는 플랫맵() 내장 함수<T, R>에 멀티스레드 컨텍스트를 내부적으로 제공하도록 구성할 수 있다.이러한 컨텍스트는 Scheduler.io 또는 Scheduler.computation과 같은 다중 인터페이스 스케줄러에 의해 제공된다.
RxJava2 스케줄러 및 Concurrency에 대한 자세한 내용은 코드 샘플과 Scheduler를 순차적으로 동시에 사용하는 방법에 대한 자세한 설명을 참조하십시오.
이게 도움이 되길 바래
소프트제이크
블로그 게시물:
Schedulers.io는 무한 스레드 풀로 지원된다.파일 시스템과의 상호 작용, 네트워크 호출 수행, 데이터베이스 상호 작용 등을 포함한 비 CPU 집약적인 I/O 유형 작업에 사용된다.이 스레드 풀은 비동기식으로 차단 IO를 수행하는 데 사용되도록 설계되었다.
스케줄러.computation()은 사용 가능한 프로세서 수까지의 크기를 가진 경계된 스레드 풀에 의해 백업된다.이미지 크기 조정, 대용량 데이터 세트 처리 등 컴퓨팅이나 CPU 집약적인 작업에 사용된다.사용 가능한 코어보다 더 많은 컴퓨팅 스레드를 할당할 경우 프로세서 시간 동안 스레드가 경쟁하는 만큼 컨텍스트 전환 및 스레드 생성 오버헤드로 인해 성능이 저하됨을 주의하십시오.
스케줄러.new스레드()는 예정된 각 작업 단위에 대해 새 스레드를 생성한다.이 스케줄러는 매번 새로운 스레드가 생성되고 재사용이 발생하지 않기 때문에 비용이 많이 든다.
스케줄러.from(실행자 실행자)에서 지정된 실행자가 지원하는 사용자 지정 스케줄러를 생성하고 반환함스레드 풀의 동시 스레드 수를 제한하려면 Scheduler.from(Executors.newFixed)을 사용하십시오.스레드풀(n)이렇게 하면 모든 스레드를 점유할 때 작업이 예약되어 있으면 대기열에 들어가게 된다.풀의 스레드는 명시적으로 종료될 때까지 존재하게 된다.
메인 스레드 또는 AndroidSchedulers.mainThread()는 RxAndroid 확장 라이브러리에서 RxJava에 제공한다.주 스레드(UI 스레드라고도 함)는 사용자 상호 작용이 발생하는 곳이다.janky 비응답 UI를 방지하기 위해 이 스레드에 과부하가 걸리지 않도록 주의하거나, 더 나쁜 경우 Application Not Response"(ANR) 대화 상자를 표시해야 한다.
스케줄러.single()은 RxJava 2에서 새로운 것이다.이 스케줄러는 요청된 순서대로 작업을 순차적으로 실행하는 단일 스레드에 의해 백업된다.
스케줄러.트램폴린()은 참여하는 작업자 스레드 중 하나에 의해 FIFO(First In, First Out) 방식으로 작업을 실행한다.콜 스택의 증가를 피하기 위해 재귀성을 구현할 때 자주 사용된다.
참조URL: https://stackoverflow.com/questions/31276164/use-cases-for-rxjava-schedulers
'programing' 카테고리의 다른 글
자바에서 C++ Pair에 해당하는 것은? (0) | 2022.05.25 |
---|---|
X타입에프(struct X typedef) vs.X형 구조체? (0) | 2022.05.25 |
DevTools를 통해 vuex 상태를 변경할 수 있는가? (0) | 2022.05.25 |
Java 8 병렬 스트림의 사용자 지정 스레드 풀 (0) | 2022.05.24 |
역 엔지니어링으로부터 실행 파일을 보호하시겠습니까? (0) | 2022.05.24 |