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

2018-08-07 15:55 更新

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

圖15.7顯示了如何使用 EventLoopGroup。

.jpg)

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

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

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

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

一旦 Channel 是分配給一個(gè) EventLoop,它將使用這個(gè) EventLoop 在它的生命周期里和同樣的線程。你可以,也應(yīng)該,依靠這個(gè),因?yàn)樗梢源_保你不需要擔(dān)心同步(包括線程安全、可見性和同步)在你 ChannelHandler實(shí)現(xiàn)。

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

EventLoop 和 Channel

我們應(yīng)該注意,在 Netty 4 , Channel 可能從 EventLoop 注銷稍后又從不同 EventLoop 注冊。這個(gè)功能是不贊成,因?yàn)樗趯?shí)踐中沒有很好的工作

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

.jpg)

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

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

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號