Vertx线程模型

时间:2016-11-22 16:05:21

标签: java reactive-programming vert.x

我有两个与Vertx线程模型相关的问题。 The documentation提及:

  • Vert.x实例默认维护N个事件循环线程(其中N默认为核心* 2)。
  • 对于许多现代应用程序所需的并发级别,阻塞方法不能扩展

Vertx还提供与线程池相关的功能,以使用需要很长时间进行事件处理的服务器资源(工作线程)来处理任务。

好的,我们知道线程在它们需要的内存(例如堆栈)和上下文切换方面有开销。

Vertx线程没有被阻塞(如果使用得当,但是如果我们有更多的事件循环而不是内核(以及工作线程的线程池),上下文切换不是不可避免的吗?

第二个问题 - 考虑到线程切换/调度是在OS级别完成的事实,我想了解vert如何确保单个线程正在为事件循环运行。我在this documentation中红了那个:

事件循环上下文在事件循环上执行处理程序:处理程序直接在IO线程上执行,因此:

  • 处理程序将始终使用相同的线程执行
  • 处理程序必须永远不会阻塞该线程,否则会为与该事件循环相关的所有IO任务创建饥饿。

请告诉我们澄清“handlers are executed directly on the IO threads”吗?

1 个答案:

答案 0 :(得分:3)

对于您的第一个问题,上下文切换是不可避免的。目标是尽量减少它们,而不是摆脱它们。 事件循环和工作程序的默认数量是......默认值。请注意,具有8个事件循环并不意味着它们都将被使用。如果部署标准Verticle的单个实例,则只有一个实例正忙。

对于第二个问题,这意味着事件循环线程处理Netty(套接字)IO事件(Vert.x从开发人员隐藏)以及Vert.x(连接,请求)事件。实际上,当收到HTTP请求缓冲区时,事件将通过Netty和Vert.x到达您的应用程序代码。如果阻止该线程,则无法处理以下事件。