TIL

4. 스케줄러와 스레딩

기본 스레딩 — concurrency-agnostic

Schedulers 종류

Scheduler 스레드 용도
immediate() 현재 스레드 스케줄링 안 함(no-op)
single() 단일 재사용 스레드 가벼운 단일 스레드 작업 (newSingle()은 호출마다 전용)
parallel() 코어 수 고정 풀 CPU 바운드·빠른 논블로킹 작업
boundedElastic() 상한 탄력 풀(기본 코어×10, 최대 10만 작업 큐) 블로킹 I/O·장시간 작업 격리
fromExecutorService(...) 주어진 풀 기존 ExecutorService 재사용

publishOn — 이후(downstream) 전환

subscribeOn — 구독(upstream) 전환

Scheduler s = Schedulers.newParallel("parallel", 4);

// publishOn: 놓은 지점 "이후"가 s에서 실행
Flux.range(1, 2)
    .map(i -> 10 + i)         // 구독한 스레드에서 실행
    .publishOn(s)             // 여기서 s로 전환
    .map(i -> "value " + i);  // s(parallel) 스레드에서 실행

// subscribeOn: 위치와 무관하게 구독/소스가 s에서 시작
Flux.range(1, 2)
    .map(i -> 10 + i)         // s(parallel) 스레드에서 실행
    .subscribeOn(s)           // 구독을 s로 이동 (위치 무관)
    .map(i -> "value " + i);  // s(parallel) 스레드에서 실행
  영향 방향 위치 의존 대표 용도
publishOn 이후(downstream) 놓은 지점부터 특정 구간만 다른 스레드로
subscribeOn 구독·소스(upstream) 위치 무관(소스에 가까운 것만) 소스 방출 스레드 지정, 블로킹 소스 격리

블로킹 코드 격리