You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mono.then()与.and()的并行执行差异:我的理解是否有误?

Reactor中and()方法的执行行为解析

你的理解是正确的:and()方法本身并不会自动让两个插入操作并行执行,除非操作本身是异步实现,或者你显式通过subscribeOn()指定了不同的调度器。

两种写法的核心区别

  1. 原写法使用then():

    insertTableOne(foo).then(insertTableTwo(foo)).then(Mono.just(foo));
    

    then()的逻辑是等待前一个Mono完全执行完成后,才会触发下一个Mono的订阅和执行,是严格的串行执行顺序。

  2. 团队建议的and()写法:

    insertTableOne(foo).and(insertTableTwo(foo)).thenReturn(foo);
    

    and()的作用是同时订阅两个Mono,并等待两者都完成后再继续,但这并不等于并行执行:

    • 如果insertTableOne和insertTableTwo是阻塞同步操作(比如基于传统JDBC的同步数据库插入),那么订阅第一个Mono时会阻塞当前线程,直到它执行完毕,才会订阅并执行第二个Mono,最终还是串行执行。
    • 只有当两个操作本身是异步非阻塞(比如使用R2DBC等非阻塞数据库驱动),或者你为每个操作指定了独立的调度器时,才会真正实现并行:
      insertTableOne(foo).subscribeOn(Schedulers.parallel())
          .and(insertTableTwo(foo).subscribeOn(Schedulers.parallel()))
          .thenReturn(foo);
      

关键结论

Reactor中的并行执行不是由and()这类合并方法决定的,而是由操作的异步性和线程调度策略决定的。and()只是提供了一种合并两个Mono、等待两者完成的便捷方式,本身不会改变操作的执行线程模型。

内容的提问来源于stack exchange,提问作者Snuii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:07:08