我有两个与Vertx线程模型相关的问题。 The documentation提及:
Vertx还提供与线程池相关的功能,以使用需要很长时间进行事件处理的服务器资源(工作线程)来处理任务。
好的,我们知道线程在它们需要的内存(例如堆栈)和上下文切换方面有开销。
Vertx线程没有被阻塞(如果使用得当,但是如果我们有更多的事件循环而不是内核(以及工作线程的线程池),上下文切换不是不可避免的吗?
第二个问题 - 考虑到线程切换/调度是在OS级别完成的事实,我想了解vert如何确保单个线程正在为事件循环运行。我在this documentation中红了那个:
事件循环上下文在事件循环上执行处理程序:处理程序直接在IO线程上执行,因此:
请告诉我们澄清“handlers are executed directly on the IO threads
”吗?
答案 0 :(得分:3)
对于您的第一个问题,上下文切换是不可避免的。目标是尽量减少它们,而不是摆脱它们。 事件循环和工作程序的默认数量是......默认值。请注意,具有8个事件循环并不意味着它们都将被使用。如果部署标准Verticle的单个实例,则只有一个实例正忙。
对于第二个问题,这意味着事件循环线程处理Netty(套接字)IO事件(Vert.x从开发人员隐藏)以及Vert.x(连接,请求)事件。实际上,当收到HTTP请求缓冲区时,事件将通过Netty和Vert.x到达您的应用程序代码。如果阻止该线程,则无法处理以下事件。