2017-09-04 34 views
0

Vert.x有許多線程池,eventLoopGroup, acceptorEventLoopGroup,internalBlockingPool,workerPool有關Vert.x線程池的一些問題?

爲什麼需要這麼多?

目錄下讀取文件將使用internalBlockingPool,但這樣的代碼executeBlocking將使用workerPool

而在此代碼爲什麼resultHandler在eventLoop線程中執行不是 工作區?

vertx.executeBlocking(future -> { 
       System.out.println(Thread.currentThread().getName()); 
       future.complete(); 
      }, r -> { 
       System.out.println(Thread.currentThread().getName()); 
      }); 

在我的理解事件循環只是一個單獨的線程是無限循環的channel.If無關的網絡,無需使用eventLoopGroup。

如何理解event在Vert.x,可以給一些Vert.x代碼不netty代碼

回答

2

事件循環:可以有不止一個事件循環線程。通常會有多個事件循環線程(這取決於您的內核數量)。例如,如果啓動Verticle的N個實例,則需要使用多個事件循環將其分散到多個核心中。在文檔中,查看多反應堆模式。

Vert.x在這裏的工作方式不同。 Vertx實例不是單個事件循環,而是每個維護幾個事件循環。默認情況下,我們根據機器上可用內核的數量選擇 號碼,但可以覆蓋此 。

http://vertx.io/docs/vertx-core/java/#_reactor_and_multi_reactor

關於你提到的關於結果的處理問題:執行阻擋功能將在一個工作線程運行,但一旦全部完成,將被推到事件循環線程完成結果處理器。這種行爲有助於保持事件循環線程上的某些邏輯。

關於其他線程組,他們只處理vert.x中的特定功能。如果你對vert.x中的線程數量感到緊張,我不會擔心它。 Vert.x在保持較高的功能和吞吐量的同時保持最低的操作系統線程性能。

+0

謝謝,[這種行爲有助於保持事件循環線程上的某些邏輯]可以舉一個例子嗎? – twogoods

+0

在輔助線程完成execute函數之後,幾乎總是需要回到事件循環線程上。通過在事件循環中運行結果處理程序,它有助於回到事件循環。大部分「正常」操作將在事件循環中完成,工作線程用於需要阻止IO或長時間運行CPU的情況。 – adamM