gpt4 book ai didi

spring - 把阻塞代码包装成一个Mono flatMap,这还是非阻塞操作吗?

转载 作者:行者123 更新时间:2023-12-05 02:17:06 25 4
gpt4 key购买 nike

如果我将阻塞代码包装到一个 flatMap 中,这仍然是一个非阻塞操作吗?

例子:

    public Mono<String> foo() {

Mono.empty().flatMap(obj -> {

try {

Object temp = f.get();//are the thread at this point blocked or not ?

} catch (Exception e) {
e.printStackTrace();
throw e;
}

return Mono.just("test");

});

所以,我认为当我将阻塞代码包装到 react 代码中时,操作仍然是非阻塞的?如果我错了,请向我解释。

最佳答案

if i wrap blocking code into a flatMap, is this still a non-blocking operation ?

flatMap 不会为您创建新线程。例如:

Mono.just("abc").flatMap(val -> Mono.just("cba")).subscribe();

以上所有代码将由调用subscribe的当前线程执行。因此,如果映射器函数包含一个长阻塞操作,则调用订阅的线程也将被阻塞。

要将其转换为异步操作,您可以使用 subscribeOn(Schedulers.elastic());

 Mono.just("abc").flatMap(val -> Mono.just("cba")).subscribeOn(Schedulers.elastic());

Mono 和 Flux 不创建线程,但是一些运算符将 Scheduler 作为额外的参数来使用,例如 interval 运算符,或者一起改变线程模型,例如作为 subscribeOn

还有一点,在您的示例中,永远不会调用 mapper 函数,因为您将 flatMap 应用于一个空的单声道,它直接完成而没有发出任何值。

关于spring - 把阻塞代码包装成一个Mono flatMap,这还是非阻塞操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48349421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com