我之前将实体保存到表中,如下所示:
insertTableOne(foo).then(insertTableTwo(foo)).then(Mono.just(foo));
团队成员建议使用以下方法.and()
来并行化插入件:
insertTableOne(foo).and(insertTableTwo(foo).thenRetuen(foo);
虽然我同意它看起来更简洁,但我找不到任何文档表明使用.and()
将同时执行Schedulers.parallel()
两个插入。我认为它仍然是连续的,除非明确说明与并行。
我错了吗?
两个示例的区别如下。
首先你必须记住,这里执行的所有操作都已完成
async
。这意味着没有任何操作被阻塞。某些操作被触发,然后线程继续执行其他操作,直到返回某种形式的响应。then 关键字在文档中描述如下
insertTableOne
意味着当完成后它就会启动insertTableTwo
。所以是的,它们将被按顺序执行。
如果我们在文档中查找关键字
and
:那么这是什么意思呢?嗯,这意味着当两者都
Mono's
终止时,无论出于何种原因,我们都会返回 void。如果第一个成功,另一个失败,或者相反,或者两者都失败,我们不在乎,两者都必须完成它们正在做的事情,然后我们将返回并继续。是的,这意味着两者将同时被解雇,
async
看看我在这里如何选择我的词语。不是parallel
我在写async
。可以这样想,如果我们是并行的,那么就是两个人发送两封电子邮件。如果我们是异步的,那么一个人发送 2 封电子邮件,但彼此之间发送速度非常快。这也意味着,两个不同的人将分别处理一封电子邮件,或者在异步情况下,一个人处理 2 封电子邮件,但彼此之间发送速度非常快。
因此,在您的情况下,可能是来自单个调度程序的同一线程为事件循环调度两个作业,或两个单独的线程调度工作。这无关紧要,您也不必在意,因为这取决于库来处理。
您应该关心的是如何处理失败的错误,
and()
无论结果如何都会继续,所以您不知道是否失败了。并强调一下你的最后一句话:
webflux 中的所有内容都是
async
默认的,如果您明确说明也可以。您可以按顺序parallel
执行操作。async
举个例子:
上面的例子是理论上的,但我想强调的是,这
async
不是paralellel
,但异步可以sequential