官术网_书友最值得收藏!

2.2 Netty線程模型

從本節開始了解Netty的特性,首先從線程模型開始。在第1章中,講到過兩個線程組,即Boss線程組和Worker線程組。其中,Boss線程組一般只開啟一條線程,除非一個Netty服務同時監聽多個端口。Worker線程數默認是CPU核數的兩倍,Boss線程主要監聽SocketChannel的OP_ACCEPT事件和客戶端的連接(主線程)。

當Boss線程監聽到有SocketChannel連接接入時,會把SocketChannel包裝成NioSocketChannel,并注冊到Worker線程的Selector中,同時監聽其OP_WRITE和OP_READ事件。當Worker線程監聽到某個SocketChannel有就緒的讀I/O事件時,會進行以下操作。

(1)向內存池中分配內存,讀取I/O數據流。

(2)將讀取后的ByteBuf傳遞給解碼器Handler進行解碼,若能解碼出完整的請求數據包,就會把請求數據包交給業務邏輯處理Handler。

(3)經過業務邏輯處理Handler后,在返回響應結果前,交給編碼器進行數據加工。

(4)最終寫到緩存區,并由I/O Worker線程將緩存區的數據輸出到網絡中并傳輸給客戶端。

Netty主從線程模型如圖2-3所示,圖中有個任務隊列,這個任務隊列主要是用來處理一些定時任務的,如連接的心跳檢測。同時,當開啟了額外業務線程時,寫回響應結果也會被封裝成任務,交給I/O Worker線程來完成。

圖2-3 Netty主從線程模型

主站蜘蛛池模板: 威海市| 七台河市| 嘉禾县| 云南省| 洞头县| 慈利县| 高阳县| 海安县| 德庆县| 东乡族自治县| 灌云县| 靖宇县| 济宁市| 永昌县| 调兵山市| 台中县| 石林| 涿州市| 阿荣旗| 榆社县| 汪清县| 丹寨县| 麻栗坡县| 久治县| 佳木斯市| 雷波县| 萝北县| 建德市| 武强县| 紫阳县| 承德市| 黔西| 衡阳市| 卓资县| 沁阳市| 珠海市| 台中县| 鄄城县| 云南省| 襄汾县| 桐柏县|