gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:30:06 25 4
gpt4 key购买 nike

我对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com