Vert.x有许多线程池,eventLoopGroup
,acceptorEventLoopGroup
,internalBlockingPool
,workerPool
。
为什么需要这么多?
FileSystem读取文件将使用internalBlockingPool
,但是像这样的代码,executeBlocking将使用workerPool
。
在这段代码中,为什么resultHandler不在eventLoop线程中执行 workpool?
vertx.executeBlocking(future -> {
System.out.println(Thread.currentThread().getName());
future.complete();
}, r -> {
System.out.println(Thread.currentThread().getName());
});
在我的理解eventloop中,只有一个线程是无限循环的通道。如果与网络无关,则无需使用eventLoopGroup。
如何理解Vert.x中的event
,可以为某些Vert.x代码提供netty
代码吗?
答案 0 :(得分:2)
事件循环:可以有多个事件循环线程。通常会有多个事件循环线程(它取决于您的核心数)。例如,如果启动Verticle的N个实例,则需要使用多个事件循环将其分布在多个核心上。在文档中,查找多反应堆模式。
Vert.x在这里的工作方式不同。而不是单个事件循环,每个 Vertx实例维护多个事件循环。默认情况下我们选择 数字基于机器上可用核心的数量,但这个 可以被覆盖。
http://vertx.io/docs/vertx-core/java/#_reactor_and_multi_reactor
关于结果处理程序的问题:执行阻塞函数将在工作线程上运行,但一旦完成,它将被推送到事件循环线程以完成结果处理程序。此行为有助于在事件循环线程上保留某些逻辑。
关于其他线程组,它们只处理vert.x中的特定功能。如果你对vert.x中的线程数量感到压力,我不会担心它。 Vert.x在保持高功能和吞吐量的同时将OS线程保持在最低水平做得很好。