当前位置: 首页 > 知识库问答 >
问题:

可以使用Mono吗。用于阻塞操作的publishOn(Schedulers.elastic)?

艾文斌
2023-03-14

我理解在反应流中使用阻塞操作时,我们应该使用Publisher

我知道当我的发布者发布一个项目列表(For ex: Flux)时,未来的项目不必等待当前项目被阻塞操作阻塞。但是在Mono的情况下,有必要吗?因为我的管道中只有一个项目流动。

另外,我使用的是spring boot 2无功流量控制器。

@RestController("/item")
public Mono<Response> saveItem(Mono<Item> item) {
  return
  item.publishOn(Schedulers.elastic()) **//Do I need this ?**
      .map(blockingDB.save(item))
      .map(item -> new Response(Item);

}

共有1个答案

华恩
2023-03-14

是的,绝对!

如果不这样做,则会阻塞主处理/事件循环线程。其中,你应该只有你的机器有(有效)CPU的数量。

假设是8个。这意味着只有8个并发请求在等待阻塞操作,您将使您的应用程序完全停止!

此外,请确保在阻塞操作之后将处理移回一个线程池,以便进行CPU密集型工作。

 类似资料:
  • OpenResty 的诞生,一直对外宣传是同步非阻塞(100% non-blocking)的。基于事件通知的 Nginx 给我们带来了足够强悍的高并发支持,但是也对我们的编码有特殊要求。这个特殊要求就是我们的代码,也必须是非阻塞的。如果你的服务端编程生涯一开始就是从异步框架开始的,恭喜你了。但如果你的编程生涯是从同步框架过来的,而且又是刚刚开始深入了解异步框架,那你就要小心了。 Nginx 为了减

  • 这一节解释 BlockingObservable 的子类. 一个阻塞的Observable 继承普通的Observable类,增加了一些可用于阻塞Observable发射的数据的操作符。 要将普通的Observable 转换为 BlockingObservable,可以使用 Observable.toBlocking( )) 方法或者BlockingObservable.from( )) 方法。

  • 我试图用Java实现这里描述的非阻塞二叉查找树。该算法基于单世界CAS,但是: 状态和信息字段一起存储在 CAS 对象中。因此,内部节点使用四个字的内存。 我决定使用AtomicStampedReference来存储这些数据。问题是它 通过创建表示“盒装”[引用,整数] 对的内部对象来维护标记引用。 该结构的内部实施: 配对定义为: 这个实现仍然是非阻塞的吗? 额外的问题是:是什么使这种compa

  • 问题内容: 我想使用redis的pubsub传输一些消息,但不想使用阻止,例如以下代码: 最后一部分将被阻止。我只想检查给定频道中是否有数据,该如何完成?有没有类似的方法? 问题答案: 我认为那不可能。通道没有任何“当前数据”,您订阅了一个通道并开始接收该通道上其他客户端推送的消息,因此它是一个阻塞的API。另外,如果您查看pub / sub 的Redis Commands文档,将会更加清楚。

  • 问题内容: 我的印象是,通过SQLAlchemy进行的数据库调用将被阻止,不适合用于除同步代码以外的任何其他内容。我是正确的吗(我希望不是!),或者是否可以将其配置为非阻塞状态? 问题答案: 您可以使用gevent以非阻塞样式使用SQLA。这是使用psycopg2和psycopg2的协程支持的示例: https://bitbucket.org/zzzeek/green_sqla/ 我也听说人们在p

  • 我不能让非常基本的底拖示例按预期工作。下面的代码应该允许服务并发HTTP请求。实际发生的情况是,只有一个请求被处理,在第一个请求完成之前,其他请求都无法通过。 增加XNIO线程数及其工作线程不会改变任何事情。一个随机的XNIO被分配给请求。然后在调度后分配一个随机工作者。服务器一直处于阻塞状态,直到请求得到服务。