2016-11-22 103 views
0

我得到了2個與Vertx線程模型有關的問題。 The documentation提到:Vertex線程模型

  • 甲Vert.x實例維護Ñ事件循環線程(其中N由缺省值是芯* 2)由缺省值。
  • 對於絕大多數應用所要求的併發水平,阻塞的方法不能按比例

Vertx還提供了線程池相關的函數來處理使用要求對事件處理很長時間的服務器資源的任務(工線程)。好的,所以我們知道線程在它們所需的內存(例如它們的堆棧)和上下文切換方面具有開銷。

Vertx線程不會被阻塞(如果正確使用),但是如果我們得到比核心更多的事件循環(以及工作線程的線程池)不是上下文切換不可避免的嗎?

第二個問題 - 我想了解vert如何確保單個線程運行事件循環,考慮到線程切換/調度在OS級別完成的事實。我在this documentation紅認爲:

事件循環背景上的一個事件循環執行處理程序:處理程序直接在IO線程執行,其結果是:

  • ,處理器將總是以相同的線程中執行
  • 處理程序不能阻塞該線程,否則會爲與該事件循環關聯的所有IO任務創建飢餓。

somone請澄清「handlers are executed directly on the IO threads」嗎?

回答

2

對於你的第一個問題,上下文切換是不可避免的。目標是儘量減少它們,而不是擺脫它們。 事件循環和工作人員的默認數字是...默認值。請注意,擁有8個事件循環並不意味着它們都將被使用。如果您部署標準Verticle的單個實例,則只有一個實例處於忙碌狀態。

對於第二個問題,這意味着事件循環線程處理Netty(套接字)IO事件(由Vert.x從開發人員隱藏)以及Vert.x(連接,請求)事件。在實踐中,當收到HTTP請求緩衝區時,事件會經過Netty和Vert.x直到您的應用程序代碼。如果阻塞線程,則無法處理以下事件。