Vert.x verticle "instances"是什么,它们与线程有什么关系?

4
在Vert.x应用程序中部署Verticle时,文档似乎极不清楚Verticle“实例”是什么以及它如何与线程和线程池相关。事实上,它对任何与实际线程模型有关的内容都相当不清楚。
根据文档:
Vert.x在这里的工作方式不同。每个Vertx实例维护几个事件循环,而不是单个事件循环。默认情况下,我们基于机器上可用的核心数来选择数量,但可以覆盖默认值。
还根据文档:
在Vert.x服务器中实例化Verticle的数量。每个Verticle实例都是严格单线程的,因此要跨可用核心扩展应用程序,您可能需要部署多个实例。如果省略,则将部署单个实例。我们将在本用户手册的后面更详细地讨论缩放问题。
假设我想部署一个简单的REST API,编写为单个Verticle,并希望它在可用的CPU核心上高效扩展,我应该怎么做?
- 我应该每个CPU核心部署一个Verticle实例吗? - 根据文档的至少一部分,我应该部署单个Verticle实例,因为单个Verticle实例已经维护了多个事件循环(我假设1个事件循环= 1个线程)吗? - 如果我部署4个Verticle实例,实际上会创建/使用哪些线程和/或线程池?
2个回答

3
Vert.x文档中有这样一段话:
"Verticles"是由Vert.x部署和运行的代码块。默认情况下,Vert.x实例维护N个事件循环线程(其中N默认为core* 2)。
如果您想利用所有的内核,可以每个内核部署2个 "verticles"。
标准 "verticles"在创建时被指定一个事件循环线程,并在调用start方法时使用该事件循环。当您从事件循环调用任何其他核心API上的处理程序时,Vert.x将保证在调用时会在同一事件循环中执行这些处理程序。
这意味着我们可以保证verticle实例中的所有代码始终在同一个事件循环上执行(只要您不创建自己的线程并调用它!)。
当您部署一个"Verticle"时,它会被分配一个事件循环线程。这意味着在"Verticle"内编写的任何代码的执行都将在部署"Verticle"的同一事件循环上执行。这允许您在可用线程之间进行良好的扩展。

1
您关于文档清晰性的观点是正确的,我在此处发布了一个相关问题here 以下是文档中的内容:
Vert.x在这里的工作方式不同。每个Vertx实例维护多个事件循环。默认情况下,我们根据计算机上可用核心数选择数量,但可以覆盖此值。
尽管Vertx实例维护多个事件循环,但任何特定处理程序都不会并发执行,并且在大多数情况下(除了worker verticles),将始终使用完全相同的事件循环调用它。
以下是我的理解:
每个Vert.x实例将运行等于可用核心数的事件循环。
在单个Vert.x实例上,您可以部署包括在不同线程上同时运行的相同Verticle的多个Veriticles。
尽管文档说特定处理程序只在单个事件循环上执行,但我认为他们所说的“特定处理程序”是给定Verticle的对象实例,这并不意味着该相同Verticle的另一个对象实例不能在同一Vert.x上的另一个事件循环上运行。
即使此相同的Verticle在同一Vert.x上的许多事件循环中并发运行,实例也不共享任何状态,因此是线程安全的。
如果在运行于2个CPU的机器上的Vert.x上部署了4个Verticle实例,则最终将有2个事件循环每个运行2个实例,并且每个实例都将托管其自己的状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接