关于Vert.x中线程池的一些问题?

时间:2017-09-04 03:50:50

标签: multithreading vert.x

Vert.x有许多线程池,eventLoopGroupacceptorEventLoopGroupinternalBlockingPoolworkerPool

  

为什么需要这么多?

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代码吗?

1 个答案:

答案 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线程保持在最低水平做得很好。