AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79053310
Accepted
Snuii
Snuii
Asked: 2024-10-04 15:55:05 +0800 CST2024-10-04 15:55:05 +0800 CST 2024-10-04 15:55:05 +0800 CST

Mono.then() 与 .and() 的并行化对比

  • 772

我之前将实体保存到表中,如下所示:
insertTableOne(foo).then(insertTableTwo(foo)).then(Mono.just(foo));

团队成员建议使用以下方法.and()来并行化插入件:
insertTableOne(foo).and(insertTableTwo(foo).thenRetuen(foo);

虽然我同意它看起来更简洁,但我找不到任何文档表明使用.and()将同时执行Schedulers.parallel()两个插入。我认为它仍然是连续的,除非明确说明与并行。

我错了吗?

spring-webflux
  • 1 1 个回答
  • 28 Views

1 个回答

  • Voted
  1. Best Answer
    Toerktumlare
    2024-10-04T16:41:48+08:002024-10-04T16:41:48+08:00

    两个示例的区别如下。

    首先你必须记住,这里执行的所有操作都已完成async。这意味着没有任何操作被阻塞。某些操作被触发,然后线程继续执行其他操作,直到返回某种形式的响应。

    then 关键字在文档中描述如下

    让这个 Mono 完成然后播放另一个 Mono。

    insertTableOne意味着当完成后它就会启动insertTableTwo。

    所以是的,它们将被按顺序执行。

    如果我们在文档中查找关键字and:

    将此单声道和另一个源的终止信号连接到返回的空单声道中

    那么这是什么意思呢?嗯,这意味着当两者都Mono's终止时,无论出于何种原因,我们都会返回 void。如果第一个成功,另一个失败,或者相反,或者两者都失败,我们不在乎,两者都必须完成它们正在做的事情,然后我们将返回并继续。

    是的,这意味着两者将同时被解雇,async看看我在这里如何选择我的词语。不是parallel我在写async。

    可以这样想,如果我们是并行的,那么就是两个人发送两封电子邮件。如果我们是异步的,那么一个人发送 2 封电子邮件,但彼此之间发送速度非常快。这也意味着,两个不同的人将分别处理一封电子邮件,或者在异步情况下,一个人处理 2 封电子邮件,但彼此之间发送速度非常快。

    因此,在您的情况下,可能是来自单个调度程序的同一线程为事件循环调度两个作业,或两个单独的线程调度工作。这无关紧要,您也不必在意,因为这取决于库来处理。

    您应该关心的是如何处理失败的错误,and()无论结果如何都会继续,所以您不知道是否失败了。

    并强调一下你的最后一句话:

    我认为它仍然是连续的,除非明确说明是并行的

    webflux 中的所有内容都是async默认的,如果您明确说明也可以。您可以按顺序parallel执行操作。async

    举个例子:

    // This will execute n + 1 in sequence taking one item at the time 
    // preserving order and print 2,3,4
    Flux.just(1,2,3).map(n -> n + 1).subscribe(n -> System.out.println(n));
    
    // This will iterate through and execute n + 1 all at once, and 
    // order back is not guaranteed as the subscribe will print in 
    // order of what completed first, might be 2,3,4 might be 3,4,2 
    // or 2,4,3
    Flux.just(1,2,3).flatMap(n -> n + 1).subscribe(n -> System.out.println(n));
    

    上面的例子是理论上的,但我想强调的是,这async不是paralellel,但异步可以sequential

    • 1

相关问题

  • 可以跳过 doOnNext 的副作用吗?

  • 如何在 Mono 上调用阻塞 IO 调用

  • Reactor 项目 Mono.block() 和 Mono.subscribe() 有什么区别

  • Webflux Reactor如何合并Stream.map输出,可以是Mono和Flux成Flux

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve