Vertx:Verticle空闲时的资源分配?

时间:2017-11-12 08:09:20

标签: java multithreading vert.x

我是Vertx的新手,并且已在我的应用中尝试使用Vertx 3。到目前为止它似乎在某些情况下非常有用。但我确实有一个问题需要全面解答,因为文档和谷歌没有提供任何相关信息。

似乎(通过我的观察)在一个不使用聚类vertx的简单应用程序中,部署的每个Verticle都由一个单独的线程维护。但是目前我的应用程序(即使用其他框架的Web应用程序)并没有一直使用vertx,(意味着很多业务逻辑不涉及vertx,并且部署的Verticle并不总是很忙,只能以相对不频繁的方式执行操作)。我想知道在这种情况下,当Verticle部署但空闲时,线程是否会被vertx释放,并且仅在它们接收事件时使用?或者它们会占用线程而不允许应用程序的非vertx部分使用它们吗?

提前致谢

1 个答案:

答案 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个线程。