Java 为什么Vert.x为http服务器创建新的事件循环?
我有一个非常简单的Vert.x应用程序,它公开了一个ping端点: LauncherVerticle.java 现在我在VisualVM中看到了两个新线程,一个是我或多或少可以理解的接受线程,另一个是eventloop线程: 为什么要创建第三个eventloop线程?根据: 要使用的默认事件循环线程数=2*线程数 机器上的磁芯Java 为什么Vert.x为http服务器创建新的事件循环?,java,multithreading,vert.x,event-loop,Java,Multithreading,Vert.x,Event Loop,我有一个非常简单的Vert.x应用程序,它公开了一个ping端点: LauncherVerticle.java 现在我在VisualVM中看到了两个新线程,一个是我或多或少可以理解的接受线程,另一个是eventloop线程: 为什么要创建第三个eventloop线程?根据: 要使用的默认事件循环线程数=2*线程数 机器上的磁芯 看起来,您有不止一个内核。关于vert.x体系结构的文档不多,但有一个有趣的阅读 顺便说一句,我有四个核心机器,我在应用程序启动时看到相同数量的线程。我注意到,随着生成
看起来,您有不止一个内核。关于vert.x体系结构的文档不多,但有一个有趣的阅读 顺便说一句,我有四个核心机器,我在应用程序启动时看到相同数量的线程。我注意到,随着生成的负载增加,eventloop线程的数量增加,而其他线程在每个vert.x进程中保持单个 总之,
- 创建HttpServer时始终存在
- Vert.x应用程序从两个eventloop线程开始,并根据需要动态添加更多线程,直到核心数翻倍,即根据文档增加2*个核心李>
- 始终存在检测eventloop上阻塞例程超过2000毫秒的漏洞
为什么不呢?可以通过在
VertxOptions
中指定事件循环池大小来限制eventloop线程的数量。默认情况下,机器上的磁芯数为2 x您在这方面是正确的。但是我的机器有4个内核。Vert.x应该创建8个事件循环线程。为什么它决定创建第三个线程呢?线程是惰性创建的。通常,当调用runOnContext
时(例如,当应该部署新的垂直体时)。您可以调试io.vertx.core.impl.VertxThreadFactory#newThread以了解创建每个线程的原因和时间。
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);
});
}
}
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());
}
});