2011-03-29 128 views
28

您能否解釋Netty如何使用線程池工作?我是否理解正確,有兩種線程池:老闆和工人。老闆用來做I/O並且worker用來調用用戶回調(messageReceived)來處理數據?Netty如何使用線程池?

回答

26

這是從文件NioServerSocketChannelFactory

甲ServerSocketChannelFactory其中 創建一個服務器端基NIO 的ServerSocketChannel。它利用與NIO一起引入的 非阻塞I/O模式爲多個併發連接 高效地提供服務。

線程是如何工作的
有兩種類型的 NioServerSocketChannelFactory線程 ;一個是 老闆線程,另一個是工作線程 。

老闆線程
每個綁定 的ServerSocketChannel都有自己的老闆 線程。例如,如果您打開兩個 服務器端口(如80和443),則您的 將具有兩個凸臺線程。老闆 線程接受傳入連接 ,直到端口被解除綁定。一旦 連接成功接受,老闆線程將接受的 通道傳遞給NioServerSocketChannelFactory 管理的工作線程之一 。

工作線程
一個 NioServerSocketChannelFactory可以有 一個或多個工作線程。一名工作人員 線程執行非阻塞式讀取,並在 非阻塞式模式下爲一個或多個通道寫入 。

在Nio模型中,bossThread處理所有有界的套接字(listen socket),workerThread保管接受套接字(包含IO和call事件方法,如messageReceived)。

+0

這就是我的理解。但是,在Netty的所有示例中,我都看到使用cachedThreadPool設置老闆池。爲什麼不使用單線程執行程序?有什麼特別的理由嗎?在這個線程中提出這個問題,而不是一個新的問題,非常重要,因爲這個討論已經提出。 – 2017-03-31 07:45:21

14

與Netty Nio實現(3.2.4.Final)相關的描述NioServerSocketChannelFactory。

工作線程池必須能夠交付至少工作者線程數(當前默認2 *內核數)。

爲什麼?

在這種實現的情況下,每個工人都有自己的選擇器循環,這意味着每個工人將「吃掉」一個線程來睡在選擇器上。此外,該工作人員(以及相關的線程)負責進行所有實際的寫入和讀取操作(包括在管道上觸發事件,這意味着處理程序在該工作線程中執行)。

在老闆線程池的情況下,實際上線程池是不需要的,因爲當前實現只從它獲取一個線程。該線程大多數時間在服務器套接字的選擇器上休眠,在接受連接之後,該連接已註冊到worker。從那時起,工人就負責爲這種關係提供服務。