顶点线程模型
Vertx threading model
我有 2 个问题与 Vertx 线程模型有关。
The documentation 提及:
- 一个Vert.x实例默认维护N个事件循环线程(其中N默认为核心*2)。
- 对于许多现代应用程序所需的并发级别,阻塞方法无法扩展
Vertx 还提供线程池相关的功能来处理使用服务器资源的任务,需要长时间的事件处理(工作线程)。
好的,所以我们知道线程在它们所需的内存(例如它们的堆栈)和上下文切换方面有开销。
Vertx 线程不会被阻塞(如果正确使用的话)但是如果我们得到的事件循环比核心多(以及工作线程的线程池),上下文切换是不是不可避免?
第二个问题-考虑到线程switching/scheduling在OS级别完成的事实,我想了解vert如何确保事件循环的单个线程运行。我在 this documentation 中红色:
事件循环上下文在事件循环上执行处理程序:处理程序直接在 IO 线程上执行,因此:
- 处理程序将始终在同一个线程中执行
- 处理程序绝不能阻塞线程,否则它将为与该事件循环关联的所有 IO 任务造成饥饿。
有人可以澄清一下“handlers are executed directly on the IO threads
”吗?
对于你的第一个问题,上下文切换是不可避免的。我们的目标是尽量减少它们,而不是摆脱它们。
事件循环和工作人员的默认数量很好......默认。请注意,有 8 个事件循环并不意味着它们都会被使用。如果您部署一个标准 Verticle 的单个实例,那么只有一个会很忙。
关于你的第二个问题,这意味着事件循环线程处理 Netty(套接字)IO 事件(Vert.x 对开发人员隐藏)以及 Vert.x(连接、请求)事件。实际上,当接收到 HTTP 请求缓冲区时,事件会通过 Netty 和 Vert.x 到达您的应用程序代码。如果阻塞线程,则无法处理以下事件。
我有 2 个问题与 Vertx 线程模型有关。 The documentation 提及:
- 一个Vert.x实例默认维护N个事件循环线程(其中N默认为核心*2)。
- 对于许多现代应用程序所需的并发级别,阻塞方法无法扩展
Vertx 还提供线程池相关的功能来处理使用服务器资源的任务,需要长时间的事件处理(工作线程)。
好的,所以我们知道线程在它们所需的内存(例如它们的堆栈)和上下文切换方面有开销。
Vertx 线程不会被阻塞(如果正确使用的话)但是如果我们得到的事件循环比核心多(以及工作线程的线程池),上下文切换是不是不可避免?
第二个问题-考虑到线程switching/scheduling在OS级别完成的事实,我想了解vert如何确保事件循环的单个线程运行。我在 this documentation 中红色:
事件循环上下文在事件循环上执行处理程序:处理程序直接在 IO 线程上执行,因此:
- 处理程序将始终在同一个线程中执行
- 处理程序绝不能阻塞线程,否则它将为与该事件循环关联的所有 IO 任务造成饥饿。
有人可以澄清一下“handlers are executed directly on the IO threads
”吗?
对于你的第一个问题,上下文切换是不可避免的。我们的目标是尽量减少它们,而不是摆脱它们。 事件循环和工作人员的默认数量很好......默认。请注意,有 8 个事件循环并不意味着它们都会被使用。如果您部署一个标准 Verticle 的单个实例,那么只有一个会很忙。
关于你的第二个问题,这意味着事件循环线程处理 Netty(套接字)IO 事件(Vert.x 对开发人员隐藏)以及 Vert.x(连接、请求)事件。实际上,当接收到 HTTP 请求缓冲区时,事件会通过 Netty 和 Vert.x 到达您的应用程序代码。如果阻塞线程,则无法处理以下事件。