Vertx:Verticles空闲时的资源分配?
Vertx: resource allocation when verticles are idle?
我是 Vertx 的新手,一直在我的应用程序中试验 Vertx 3。到目前为止,它在某些情况下似乎真的很有用。但是我确实有一个问题想要一个全面的答案,因为文档和 Google 没有提供任何关于这个的信息。
似乎(通过我的观察)在一个不使用集群顶点的简单应用程序中,部署的每个顶点都由一个单独的线程维护。但是目前我的应用程序(即使用其他框架的Web应用程序)并没有一直使用vertx,(意味着很多业务逻辑不涉及vertx并且部署的verticles并不总是很忙并且只以相对不频繁的方式执行操作).我想知道在这种情况下,当 Verticle 已部署但处于空闲状态并且仅在它们接收到事件时才使用时,Vertex 是否会释放线程?或者它们会占用线程并且不允许应用程序的非顶点部分使用它们吗?
提前致谢
其实这部分讲得很好:http://vertx.io/docs/vertx-core/java/#_reactor_and_multi_reactor
Vert.x works differently here. Instead of a single event loop, each
Vertx instance maintains several event loops. By default we choose the
number based on the number of available cores on the machine, but this
can be overridden.
你错了,绑定线程的Verticle是占用线程的Verticle。假设您有 4 个 CPU 和 1 个 Verticle。 VertX 将为其 EventLoop 分配 4 个线程。你开始100个顶点? VertX 仍将使用 4 个线程。
但是,假设 Verticle34 在 Thread2 上启动,然后被挂起,它将始终在同一个线程上恢复。
现在让我们看一些代码:
public class EventLoopExample {
static Map<String, AtomicInteger> threadCounts = new ConcurrentHashMap<>();
public static void main(String[] args) {
printActive("Before starting VertX");
Vertx vertx = Vertx.vertx();
printActive("After starting VertX");
for (int i = 0; i < 1000; i++) {
vertx.deployVerticle(new MyVerticle());
printActive("Regular verticle deployed");
}
printActive("Before deploying worker verticles");
for (int i = 0; i < 1000; i++) {
vertx.deployVerticle(new MyVerticle(), new DeploymentOptions().setWorker(true));
printActive("Worker verticle deployed");
}
printActive("After everything deployed");
System.out.println(new TreeMap(threadCounts));
AtomicInteger count = new AtomicInteger(0);
threadCounts.forEach((key, value) -> {
count.addAndGet(value.get());
});
System.out.println(count.get());
}
private static void printActive(String message) {
System.out.println(message);
System.out.println(Thread.activeCount());
}
static class MyVerticle extends AbstractVerticle {
@Override
public void start() {
threadCounts.putIfAbsent(Thread.currentThread().getName(), new AtomicInteger(0));
threadCounts.get(Thread.currentThread().getName()).incrementAndGet();
}
@Override
public void stop() throws Exception {
System.out.println("Stopped");
}
}
}
注意:
在 VertX 启动之前,您有 2 个线程处于活动状态
VertX 的启动会增加 2 个线程,即使您没有部署 Verticles
EventLoop 线程数由核心数定义。由于我有 8 个内核,VertX 最多创建 8 个线程。
工作池默认为 20 个线程。
因此,除非您创建更多的 WorkerPools 或以任何其他方式使用配置,否则 VertX 不会使用超过 ~32 个线程。
我是 Vertx 的新手,一直在我的应用程序中试验 Vertx 3。到目前为止,它在某些情况下似乎真的很有用。但是我确实有一个问题想要一个全面的答案,因为文档和 Google 没有提供任何关于这个的信息。
似乎(通过我的观察)在一个不使用集群顶点的简单应用程序中,部署的每个顶点都由一个单独的线程维护。但是目前我的应用程序(即使用其他框架的Web应用程序)并没有一直使用vertx,(意味着很多业务逻辑不涉及vertx并且部署的verticles并不总是很忙并且只以相对不频繁的方式执行操作).我想知道在这种情况下,当 Verticle 已部署但处于空闲状态并且仅在它们接收到事件时才使用时,Vertex 是否会释放线程?或者它们会占用线程并且不允许应用程序的非顶点部分使用它们吗?
提前致谢
其实这部分讲得很好:http://vertx.io/docs/vertx-core/java/#_reactor_and_multi_reactor
Vert.x works differently here. Instead of a single event loop, each Vertx instance maintains several event loops. By default we choose the number based on the number of available cores on the machine, but this can be overridden.
你错了,绑定线程的Verticle是占用线程的Verticle。假设您有 4 个 CPU 和 1 个 Verticle。 VertX 将为其 EventLoop 分配 4 个线程。你开始100个顶点? VertX 仍将使用 4 个线程。
但是,假设 Verticle34 在 Thread2 上启动,然后被挂起,它将始终在同一个线程上恢复。
现在让我们看一些代码:
public class EventLoopExample {
static Map<String, AtomicInteger> threadCounts = new ConcurrentHashMap<>();
public static void main(String[] args) {
printActive("Before starting VertX");
Vertx vertx = Vertx.vertx();
printActive("After starting VertX");
for (int i = 0; i < 1000; i++) {
vertx.deployVerticle(new MyVerticle());
printActive("Regular verticle deployed");
}
printActive("Before deploying worker verticles");
for (int i = 0; i < 1000; i++) {
vertx.deployVerticle(new MyVerticle(), new DeploymentOptions().setWorker(true));
printActive("Worker verticle deployed");
}
printActive("After everything deployed");
System.out.println(new TreeMap(threadCounts));
AtomicInteger count = new AtomicInteger(0);
threadCounts.forEach((key, value) -> {
count.addAndGet(value.get());
});
System.out.println(count.get());
}
private static void printActive(String message) {
System.out.println(message);
System.out.println(Thread.activeCount());
}
static class MyVerticle extends AbstractVerticle {
@Override
public void start() {
threadCounts.putIfAbsent(Thread.currentThread().getName(), new AtomicInteger(0));
threadCounts.get(Thread.currentThread().getName()).incrementAndGet();
}
@Override
public void stop() throws Exception {
System.out.println("Stopped");
}
}
}
注意:
在 VertX 启动之前,您有 2 个线程处于活动状态
VertX 的启动会增加 2 个线程,即使您没有部署 Verticles
EventLoop 线程数由核心数定义。由于我有 8 个内核,VertX 最多创建 8 个线程。
工作池默认为 20 个线程。
因此,除非您创建更多的 WorkerPools 或以任何其他方式使用配置,否则 VertX 不会使用超过 ~32 个线程。