当前位置: 首页 > news >正文

Reactor线程池切换publishOn与subscribeOn

在 Reactor(Project Reactor)中,publishOnsubscribeOn是用于切换执行线程(调度器)的两个操作符,但它们的行为和用途截然不同。下面是它们的详细区别与使用说明。


🧠 一句话理解

  • **subscribeOn**:指定源(Publisher)创建 & 订阅逻辑运行在哪个线程。
  • **publishOn**:指定后续操作符运行在哪个线程(从当前开始切换)。

🔁 subscribeOn:影响订阅动作及其“上游”

Mono.fromCallable(()->{log.info("Generating value");return"Hello";}).subscribeOn(Schedulers.boundedElastic())// 👈 切换线程.map(v->{log.info("Mapping: {}",v);returnv.toUpperCase();});

📌 说明:

  • subscribeOn会影响:
    • 源数据的创建(如fromCallableMono.just
    • 源的订阅行为
    • 上游所有逻辑(在链条中靠前)

🧪 输出结果中的 log 会显示Generating valueMapping: xxx都在boundedElastic线程中执行。


🔀 publishOn:影响后续操作符

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: Hello

⚠️ 两者配合使用

Mono.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

🔍 总结对比表

特性subscribeOnpublishOn
生效位置整个流的最上游(首次调用生效)只影响之后的操作符
常用于指定数据源的线程(IO、慢操作)指定数据处理的线程
多次调用只有第一次调用有效(对源)可以多次调用,影响每一处之后
应用场景创建慢资源(数据库、文件等)控制不同阶段逻辑在不同线程
替代线程切换逻辑可以代替传统线程池包装异步逻辑用于流中间切线程做不同的隔离或调度

✅ 实践建议

  • 网络/IO/阻塞调用 ➜ 放在subscribeOn(Schedulers.boundedElastic())
  • 业务计算阶段 ➜ 用publishOn(Schedulers.parallel())来提高并发度
  • 不要滥用这两个操作符,频繁切线程反而会增加上下文切换成本

如你有具体的使用场景(如 Flux + WebClient、文件读取、Kafka 等),我可以针对场景详细分析。

http://www.jsqmd.com/news/294589/

相关文章:

  • 本地win系统和vmware 虚拟机 ubuntu实现文件共享
  • CDC虚拟串口与硬件串口传输速度的对比测试
  • 数据结构:加权图 - 详解
  • Xcode中iOS资源混淆问题与解决方案详解
  • 导师推荐2026 TOP10 AI论文软件:本科生毕业论文写作全解析
  • 2026年豆包优化工具选型:从技术底层到效果落地5大核心评估
  • 2026年1月DeepSeek优化服务商口碑TOP10:从技术到效果转化的选型
  • Git代码规范
  • 亲测好用10个AI论文网站,继续教育学生轻松搞定毕业论文!
  • 37、SQL的Explain
  • 2026年主流GEO公司(服务商)选型与技术方案全景解析
  • sql存储
  • c++实现交互式地震层位解释的软件
  • JS DOM 操作与性能优化实战指南:构建高效可交互的页面结构 - 实践
  • 为什么要引入右值引用
  • 2026防撞车租赁推荐:大黄蜂机电设备有限公司,全国400城覆盖,45000余台设备供应
  • 2026年满意度调查服务推荐:深圳神秘顾客市场调查有限公司,专业第三方满意度调研实力之选
  • 2026年防水透气阀专业厂家推荐:昆山艾尤诺新材料科技,全系产品覆盖多领域应用
  • 学霸同款10个一键生成论文工具,研究生高效写作必备!
  • 2026年智能柜领域实力推荐:山东瀚岳智能科技,RFID/医疗/贵金属/工具/物料等全系智能柜解决方案
  • 2026年高杆灯/中杆灯/玉兰灯/智慧路灯/LED路灯厂家推荐:四川莱宏照明工程集团全品类供应
  • 2026七层共挤设备及农膜推荐:青州市鲁冠塑料有限公司,全系产品覆盖多领域应用
  • 2026年玻璃温室大棚建设厂家推荐:山东柏科阿姆农业科技开发有限公司,智能/连栋/全系玻璃温室大棚承建实力之选
  • 2026集装袋厂家推荐:抗老化/防水/防静电/危险品/吨袋集装袋全品类供应,实力优选
  • 2026年英语培训实力推荐:重庆康桥阳光艺术培训有限公司,剑桥/口语/零基础/青少年英语培训全覆盖
  • 2026年调蓄池真空冲洗设备推荐:青岛铭源环保科技优质装置/一体式/知名品牌全解析
  • 2026年工业硫酸生产厂家推荐:上海孟龙实业有限公司,多领域硫酸产品全系供应
  • 2026年格宾网石笼厂家推荐:安平县玖旺丝网制品有限公司,钢丝/镀锌/铅丝格宾网护岸全系供应
  • 【Django毕设源码分享】基于Python的智能停车管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 【Django毕设源码分享】基于Python的智能停车系统的设计与实现(程序+文档+代码讲解+一条龙定制)