Netty I/O和EventLoop/Thread的分配細節(jié)

2018-08-07 15:55 更新

Netty 使用一個包含 EventLoop 的 EventLoopGroup 為 Channel 的 I/O 和事件服務。EventLoop 創(chuàng)建并分配方式不同基于傳輸?shù)膶崿F(xiàn)。異步實現(xiàn)使用只有少數(shù) EventLoop(和 Threads)共享于 Channel 之間 。這允許最小線程數(shù)服務多個 Channel,不需要為他們每個人都有一個專門的 Thread。

圖15.7顯示了如何使用 EventLoopGroup。

.jpg)

  1. 所有的 EventLoop 由 EventLoopGroup 分配。這里它將使用三個EventLoop 實例
  2. 這個 EventLoop 處理所有分配給它管道的事件和任務。每個EventLoop 綁定到一個 Thread
  3. 管道綁定到 EventLoop,所以所有操作總是被同一個線程在 Channel 的生命周期執(zhí)行。一個管道屬于一個連接

Figure 15.7 Thread allocation for nonblocking transports (such as NIO and AIO)

如圖所述,使用有 3個 EventLoop (每個都有一個 Thread ) EventLoopGroup 。EventLoop (同時也是 Thread )直接當 EventLoopGroup 創(chuàng)建時分配。這樣保證資源是可以使用的

這三個 EventLoop 實例將會分配給每個新創(chuàng)建的 Channel。這是通過EventLoopGroup 實現(xiàn),管理 EventLoop 實例。實際實現(xiàn)會照顧所有EventLoop 實例上均勻的創(chuàng)建 Channel (同樣是不同的 Thread)。

一旦 Channel 是分配給一個 EventLoop,它將使用這個 EventLoop 在它的生命周期里和同樣的線程。你可以,也應該,依靠這個,因為它可以確保你不需要擔心同步(包括線程安全、可見性和同步)在你 ChannelHandler實現(xiàn)。

但是這也會影響使用 ThreadLocal,例如,經(jīng)常使用的應用程序。因為一個EventLoop 通常影響多個 Channel,ThreadLocal 將相同的 Channel 分配給 EventLoop。因此,它適合狀態(tài)跟蹤等等。它仍然可以用于共享重或昂貴的對象之間的 Channel ,不再需要保持狀態(tài),因此它可以用于每個事件,而不需要依賴于先前 ThreadLocal 的狀態(tài)。

EventLoop 和 Channel

我們應該注意,在 Netty 4 , Channel 可能從 EventLoop 注銷稍后又從不同 EventLoop 注冊。這個功能是不贊成,因為它在實踐中沒有很好的工作

語義跟其他傳輸略有不同,如 OIO(Old Blocking I/O)運輸,可以看到如圖14.8所示。

.jpg)

  1. 所有 EventLoop 從 EventLoopGroup 分配。每個新的 channel 將會獲得新的 EventLoop
  2. EventLoop 分配給 channel 用于執(zhí)行所有事件和任務
  3. Channel 綁定到 EventLoop。一個 channel 屬于一個連接

Figure 15.8 Thread allocation of blocking transports (such as OIO)

你可能會注意到這里,一個 EventLoop (也是一個 Thread)創(chuàng)建每個 Channel。你可能被用來從開發(fā)網(wǎng)絡應用程序是基于常規(guī)阻塞I/O在使用java.io.* 包。但即使語義變化在這種情況下,有一件事仍然是相同的:每個 I/O 通道將由一次只有一個線程來處理,這是一個線程增強 Channel 的 EventLoop??梢砸揽窟@個硬性的規(guī)則,使 Netty 的框架很容易與其他網(wǎng)絡框架進行比較。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號