2016-11-22 43 views
0

我得到了2个与Vertx线程模型有关的问题。 The documentation提到:Vertex线程模型

  • 甲Vert.x实例维护Ñ事件循环线程(其中N由缺省值是芯* 2)由缺省值。
  • 对于绝大多数应用所要求的并发水平,阻塞的方法不能按比例

Vertx还提供了线程池相关的函数来处理使用要求对事件处理很长时间的服务器资源的任务(工线程)。好的,所以我们知道线程在它们所需的内存(例如它们的堆栈)和上下文切换方面具有开销。

Vertx线程不会被阻塞(如果正确使用),但是如果我们得到比核心更多的事件循环(以及工作线程的线程池)不是上下文切换不可避免的吗?

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

事件循环背景上的一个事件循环执行处理程序:处理程序直接在IO线程执行,其结果是:

  • ,处理器将总是以相同的线程中执行
  • 处理程序不能阻塞该线程,否则会为与该事件循环关联的所有IO任务创建饥饿。

somone请澄清“handlers are executed directly on the IO threads”吗?

回答

2

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

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