W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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)
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)
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)絡框架進行比較。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: