我正在研究Netty 4.0.0.Alpha5代碼,以瞭解如何處理線程。我還在http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-h2-34上閱讀了Netty 4的新線程模型的介紹。Netty 4 - EventLoopGroup - EventLoop - EventExecutor - 線程關聯
據我瞭解,這些目標是:
- 線程親和力,堅持一個通道到一個單獨的線程(事件循環)。我想這種方法是爲了減少緩存未命中並改善NUMA硬件的狀況。
所以,我想知道我的解釋是否正確與否。如果我是正確的,那麼下面的問題出現了:
- 有一個可能長期運行的ChannelHandler中的ChannelPipeline可能會阻止事件循環(線程),因此將阻止分配到所有其他渠道(如數據庫操作)相同的EventLoop(線程)。這個解釋是真的嗎?
- 試圖避免這個問題,我可以使用的長期運行的ChannelHandler一個EventExecutor,但根據的文件(見上面的鏈接)頻道再次堅持其EventExectuor內的單個線程,因此可能再次阻止這是其他頻道分配相同的線程(在EventExecutor內)。我錯過了什麼或者這是真的嗎?
我只是想了解,爲什麼事情會是這樣的,並得到有關的Netty的設計意圖4.
我的擔心主要是關於堅持單線程模式。在古典線程池中,只要不是所有線程都被阻塞,就會發生進度。但是,如果幾個任務(事件)綁定到相同的特定線程,那麼即使該池中仍有空閒的線程,它們也可能會阻塞對方(排隊)。例如Doug Lea的ForkJoinPool通過利用工作竊取來避免這種情況。 – user1752169