spring-webflux - 我应该使用同步 Mono::map 还是异步 Mono::flatMap?
问题描述
projectReactor 文档说这Mono::flatMap
是异步的,如下所示。
所以,我可以编写我所有的方法来返回这样的 Mono 发布者。
public Mono<String> myMethod(String name) {
return Mono.just("hello " + name);
}
并Mono::flatMap
像这样使用它:
Mono.just("name").flatMap(this::myMethod);
这会使我的方法的执行异步吗?这是否使我的代码比仅使用 Mono::map更具反应性、更好和更快?对我的所有方法执行此操作的开销是否令人望而却步?
public final Mono flatMap(Function<? super T,? extends Mono<? extends R>> 转换器)
异步转换此 Mono 发出的项,返回另一个 Mono 发出的值(可能更改值类型)。
解决方案
这会使我的方法的执行异步吗?
让我们看看这个的定义Asynchronous
:
异步编程是一种并行编程方式,其中一个工作单元与主应用程序线程分开运行,并通知调用线程其完成、失败或进度。
在这里,您的工作单元发生在同一个线程中,除非您subscribeOn
使用Scheduler
. 所以这不是异步的。
这是否使我的代码比仅使用 Mono::map 更具反应性、更好和更快?
没门。由于在这种情况下,发布Mono.just("hello " + name)
者会立即通知订阅者我已完成,因此正在进行处理的线程会立即从事件循环中获取该事件并开始处理响应。
相反,这可能会导致内部操作比map
简单地转换元素的操作要少。
因此,理想情况下,当您有 I/O 操作(如 DB 调用)或网络调用时,您应该使用 aflatMap
,这可能需要一些时间,如果所有线程都忙,您可以利用这些时间来执行其他任务。
推荐阅读
- sql-server - INSERT 语句与外键约束冲突 - SQL Server/Entity Framework Core
- javascript - Firebase-tool 错过了在本地测试模式下将我的 Js 文件作为 HTML 文件发送
- python - 我无法将 numpy 数组转换为 pandas 列。数据必须是一维/索引错误
- javascript - 在这里我试图返回文件数组,但它返回未定义
- reactjs - React Hook:setState 用法
- solr - 如何在 SOLR 中找到单复数和不同的措辞情况
- c++ - 不允许不完整的类型,函数 dec/def 并且没有类
- c++ - 希望我的程序通过移动英文字母 8 个位置来加密信息,因此 A 变为 I
- python - 从 ArcGIS 要素图层保存数据
- python - 无法转换为不同的数据类型