JS 仓库跑通指南:package.json 体检与 npm ci 验证
2026/10/28 7:47:43
在 Reactor(Project Reactor)中,publishOn和subscribeOn是用于切换执行线程(调度器)的两个操作符,但它们的行为和用途截然不同。下面是它们的详细区别与使用说明。
**subscribeOn**:指定源(Publisher)创建 & 订阅逻辑运行在哪个线程。**publishOn**:指定后续操作符运行在哪个线程(从当前开始切换)。Mono.fromCallable(()->{log.info("Generating value");return"Hello";}).subscribeOn(Schedulers.boundedElastic())// 👈 切换线程.map(v->{log.info("Mapping: {}",v);returnv.toUpperCase();});📌 说明:
subscribeOn会影响:fromCallable、Mono.just)🧪 输出结果中的 log 会显示Generating value与Mapping: xxx都在boundedElastic线程中执行。
Mono.fromCallable(()->{log.info("Generating value");return"Hello";}).publishOn(Schedulers.parallel())// 👈 从这里切换线程.map(v->{log.info("Mapping: {}",v);returnv.toUpperCase();});📌 说明:
publishOn只影响后续操作符的执行线程🧪 输出 log:
[main] Generating value [parallel-1] Mapping: HelloMono.fromCallable(()->{log.info("Generating value");return"Hello";}).subscribeOn(Schedulers.boundedElastic()).publishOn(Schedulers.parallel()).map(v->{log.info("Mapping: {}",v);returnv.toUpperCase();});🧪 输出 log:
[boundedElastic-1] Generating value [parallel-1] Mapping: Hello| 特性 | subscribeOn | publishOn |
|---|---|---|
| 生效位置 | 整个流的最上游(首次调用生效) | 只影响之后的操作符 |
| 常用于 | 指定数据源的线程(IO、慢操作) | 指定数据处理的线程 |
| 多次调用 | 只有第一次调用有效(对源) | 可以多次调用,影响每一处之后 |
| 应用场景 | 创建慢资源(数据库、文件等) | 控制不同阶段逻辑在不同线程 |
| 替代线程切换逻辑 | 可以代替传统线程池包装异步逻辑 | 用于流中间切线程做不同的隔离或调度 |
subscribeOn(Schedulers.boundedElastic())publishOn(Schedulers.parallel())来提高并发度如你有具体的使用场景(如 Flux + WebClient、文件读取、Kafka 等),我可以针对场景详细分析。