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