Mono.then()与.and()的并行执行差异:我的理解是否有误?
Reactor中
and()方法的执行行为解析 你的理解是正确的:and()方法本身并不会自动让两个插入操作并行执行,除非操作本身是异步实现,或者你显式通过subscribeOn()指定了不同的调度器。
两种写法的核心区别
原写法使用
then():insertTableOne(foo).then(insertTableTwo(foo)).then(Mono.just(foo));then()的逻辑是等待前一个Mono完全执行完成后,才会触发下一个Mono的订阅和执行,是严格的串行执行顺序。团队建议的
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
相关产品推荐
相关产品推荐

