当前位置: 首页 > 知识库问答 >
问题:

为什么Vert。x是否为http服务器创建新的事件循环?

龙星辰
2023-03-14

我有一个非常简单的Vert。公开pingendpoint的x应用程序:

public class LauncherVerticle extends AbstractVerticle {
    @Override
    public void start(Future<Void> future) throws Exception {
        DeploymentOptions options = new DeploymentOptions();
        options.setConfig(config());
        options.setInstances(1);

        String verticleName = Example1HttpServerVerticle.class.getName();
        vertx.deployVerticle(verticleName, options, ar -> {
            if (ar.succeeded()) {
                future.complete();
            } else {
                future.fail(ar.cause());
            }
        });
    }
}
public class PingVerticle extends AbstractVerticle {
    @Override
    public void start(Future<Void> future) throws Exception {
        Router router = Router.router(vertx);

        router.get("/ping").handler(context -> {
            String payload = new JsonObject().put("hey", "ho").encode();
            context.response().putHeader("content-type", "application/json").end(payload);
        });
    }
}

正如预期的那样,默认情况下为Vert。x创建了两个我可以通过VisualVM看到的事件循环线程:

当然,这个应用程序什么都不做,所以我知道你可以去给PingVerticle添加一个http服务器

    String host = "0.0.0.0";
    int port = 7777;
    vertx.createHttpServer().requestHandler(router::accept).listen(port, host, ar -> {
        if (ar.succeeded()) {
            future.complete();
        } else {
            future.fail(ar.cause());

        }
    });

现在,我在VisualVM中看到有两个新线程,一个接受线程,我可以或多或少理解,另一个事件循环线程:

为什么要创建第三个eventloop线程?

共有2个答案

拓拔意
2023-03-14

没有太多关于vert. x架构的留档,但有一个有趣的阅读了解vert. x架构

顺便说一句,我有四个核心机器,我在应用程序启动时看到相同数量的线程。我注意到随着更多的负载被生成,事件循环线程的数量会增加,而其他线程在每个vert. x进程中保持单个。

总之,

    x-接受线程
    • 创建HttpServer时总是在那里
    • 垂直。x app从两个eventloop线程开始,并根据需要动态添加更多线程,直到核心数翻倍,即根据文档增加2*个核心
    • 总是在事件循环上检测阻塞例程超过2000毫秒。

那弘
2023-03-14

根据vert。javadoc:

要使用的默认事件循环线程数=2*计算机上的内核数。

看起来,你有不止一个核心。

 类似资料:
  • 在浏览vert.x Java devs guide时,我发现vert.x在每个CPU线程上附加了2个事件循环。与每个CPU线程1个事件循环相比,这对性能有何影响?

  • 本文向大家介绍什么是事件循环?相关面试题,主要包含被问及什么是事件循环?时的应答技巧和注意事项,需要的朋友参考一下 Node采用的是单线程的处理机制(所有的I/O请求都采用非阻塞的工作方式),至少从Node.js开发者的角度是这样的。而在底层,Node.js借助libuv来作为抽象封装层,从而屏蔽不同操作系统的差异,Node可以借助livuv来实现线程。下图表示Node和libuv的关系 Libu

  • 我有两项服务。一个从数据库加载数据,修改它们并调用另一个服务来保留修改后的数据: 使用这样的代码,每次调用CalledService.persistData时都会创建一个新的事务。然而,如果我删除了标有“##”的行,那么整个流程只创建了一个事务,允许在发生任何异常时回滚。 这是预期的Spring行为吗? 有没有办法保持被叫服务事务性,并避免在从调用方服务转到被叫服务时创建新事务? 请注意,我确实尝

  • https://developer.mozilla.org/en-US/docs/Web/API/EventSource EventSource接口是web内容与服务器发送事件的接口。EventSource实例打开到HTTP服务器的持久连接,HTTP服务器以文本/事件流格式发送事件。通过调用EventSource,连接将保持打开状态,直到关闭。关闭()。 据我所知,服务器发送的事件需要持久的HTT

  • 问题内容: 我了解JSON,但不了解JSONP。Wikipedia上有关JSON的文档是JSONP的最高搜索结果。它说: JSONP或“带填充的JSON”是JSON扩展,其中将前缀指定为调用本身的输入参数。 ??什么电话 这对我来说毫无意义。JSON是一种数据格式。没有电话 在第二个搜索结果是由某些人叫雷米,谁写的这个约JSONP: JSONP是脚本标记注入,它将响应从服务器传递到用户指定的函数。

  • 问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码