java - 顶点 : resource allocation when verticles are idle?

标签 java multithreading vert.x

我对 Vertx 还很陌生,并且一直在我的应用程序中尝试使用 Vertx 3。到目前为止,它在某些场景中似乎确实有用。但我确实有一个问题想要得到全面的解答,因为文档和 Google 没有提供任何相关信息。

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

提前致谢

最佳答案

实际上,这部分内容已经涵盖得很好: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.

你错误的地方是绑定(bind)到线程的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 个线程处于 Activity 状态
即使您没有部署 verticle,VertX 的启动也会添加 2 个线程
EventLoop 线程的数量由核心数量定义。由于我有 8 个核心,VertX 最多创建 8 个线程。
工作池默认为 20 个线程。
因此,除非您创建更多 WorkerPools 或以其他方式使用配置,否则 VertX 不会使用超过 32 个线程。

关于java - 顶点 : resource allocation when verticles are idle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47246757/

相关文章:

java - 我需要从 Vert.x 的 SQLConnection 获取底层 java.sql.Connection

java - 在vertx api中接受相同键的参数列表

java - 如何一次将服务器运行时添加到 Eclipse 中的多个现有项目(使用 Oracle 工具的 Kepler)

Java:创建一个在文件中其他位置可识别的类

java - 如何仅获取 JSON 对象的 ID 列表?

java - 我的 Eclipse 包资源管理器中的白色包图标

python - 检测解释器在守护线程中关闭

java - 如何通过传递新线程作为参数来执行执行器服务?

java - 配置maven打包fat jar,无需像spring boot那样解压vertx项目中的依赖项

wpf - 阻止从其他线程启动WPF对话框