我是Vertx的新手,并且已在我的应用中尝试使用Vertx 3。到目前为止它似乎在某些情况下非常有用。但我确实有一个问题需要全面解答,因为文档和谷歌没有提供任何相关信息。
似乎(通过我的观察)在一个不使用聚类vertx的简单应用程序中,部署的每个Verticle都由一个单独的线程维护。但是目前我的应用程序(即使用其他框架的Web应用程序)并没有一直使用vertx,(意味着很多业务逻辑不涉及vertx,并且部署的Verticle并不总是很忙,只能以相对不频繁的方式执行操作)。我想知道在这种情况下,当Verticle部署但空闲时,线程是否会被vertx释放,并且仅在它们接收事件时使用?或者它们会占用线程而不允许应用程序的非vertx部分使用它们吗?
提前致谢
答案 0 :(得分:2)
实际上,这部分内容非常清楚:http://vertx.io/docs/vertx-core/java/#_reactor_and_multi_reactor
Vert.x在这里的工作方式不同。而不是单个事件循环,每个 Vertx实例维护多个事件循环。默认情况下我们选择 数字基于机器上可用核心的数量,但这个 可以被覆盖。
你错的地方是绑定到线程的Verticle是占据线程的Verticle。我们假设您有4个CPU和1个Verticle。 VertX将为其分配4个线程的EventLoop。你开始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个线程处于活动状态 即使您没有部署Verticle,VertX的启动也会增加2个线程 EventLoop线程数由核心数定义。由于我有8个核心,因此VertX最多可创建8个线程 默认情况下,工作线池是20个线程 因此,除非您创建更多WorkerPools或以任何其他方式使用配置,否则VertX不会使用超过32个线程。