您能否解釋Netty如何使用線程池工作?我是否理解正確,有兩種線程池:老闆和工人。老闆用來做I/O並且worker用來調用用戶回調(messageReceived)來處理數據?Netty如何使用線程池?
回答
這是從文件NioServerSocketChannelFactory
甲ServerSocketChannelFactory其中 創建一個服務器端基NIO 的ServerSocketChannel。它利用與NIO一起引入的 非阻塞I/O模式爲多個併發連接 高效地提供服務。
線程是如何工作的
有兩種類型的 NioServerSocketChannelFactory線程 ;一個是 老闆線程,另一個是工作線程 。老闆線程
每個綁定 的ServerSocketChannel都有自己的老闆 線程。例如,如果您打開兩個 服務器端口(如80和443),則您的 將具有兩個凸臺線程。老闆 線程接受傳入連接 ,直到端口被解除綁定。一旦 連接成功接受,老闆線程將接受的 通道傳遞給NioServerSocketChannelFactory 管理的工作線程之一 。工作線程
一個 NioServerSocketChannelFactory可以有 一個或多個工作線程。一名工作人員 線程執行非阻塞式讀取,並在 非阻塞式模式下爲一個或多個通道寫入 。
在Nio模型中,bossThread處理所有有界的套接字(listen socket),workerThread保管接受套接字(包含IO和call事件方法,如messageReceived)。
與Netty Nio實現(3.2.4.Final)相關的描述NioServerSocketChannelFactory。
工作線程池必須能夠交付至少工作者線程數(當前默認2 *內核數)。
爲什麼?
在這種實現的情況下,每個工人都有自己的選擇器循環,這意味着每個工人將「吃掉」一個線程來睡在選擇器上。此外,該工作人員(以及相關的線程)負責進行所有實際的寫入和讀取操作(包括在管道上觸發事件,這意味着處理程序在該工作線程中執行)。
在老闆線程池的情況下,實際上線程池是不需要的,因爲當前實現只從它獲取一個線程。該線程大多數時間在服務器套接字的選擇器上休眠,在接受連接之後,該連接已註冊到worker。從那時起,工人就負責爲這種關係提供服務。
- 1. 爲什麼Netty需要線程池?
- 2. Reslet Netty配置 - 線程池大小
- 3. 如何使用線程池來卸載Netty處理程序的處理
- 4. 如何使升壓線程池::線程
- 5. Netty - NioWorker池和工作線程池之間的關係
- 6. 使用線程池
- 7. 使用線程池
- 8. 使用線程池
- 9. Netty連接池
- 10. 使用線程池的多線程
- 11. 使用jboss5線程池開始線程
- 12. 使用多線程的線程池
- 13. 使用線程池或線程
- 14. 如何使用線程/線程池管理多個操作?
- 15. 異步使用線程池?
- 16. 使用線程池和JMS
- 17. 使用線程池適當
- 18. HostingEnvironment.QueueBackgroundWorkItem使用ASP.Net線程池或另一個線程池?
- 19. 如何創建線程池?
- 20. 何時使用Gevent中的線程池
- 21. 瞭解Netty對線程的使用
- 22. AsyncHttpClient和Netty - 工作線程正在返回到池的鉤子?
- 23. netty線程分佈
- 24. Netty - 工作線程如何工作
- 25. 如何在多線程應用程序中使用aiopg池?
- 26. 線程池借用
- 27. 如何處理OpenMP線程池爭用
- 28. 如何限制客戶端連接的線程netty使用
- 29. 使用線程池得到number線程的使用
- 30. 如何將線程連接到線程池中的主線程?
這就是我的理解。但是,在Netty的所有示例中,我都看到使用cachedThreadPool設置老闆池。爲什麼不使用單線程執行程序?有什麼特別的理由嗎?在這個線程中提出這個問題,而不是一個新的問題,非常重要,因爲這個討論已經提出。 – 2017-03-31 07:45:21