2012-10-17 36 views
15

我正在研究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.

回答

7

真到了這兩個問題的一些信息。通過將處理程序分配給非I/O事件組,可以防止I/O線程被諸如數據庫訪問等長時間運行的操作阻塞。您可以根據處理程序的作用指定大尺寸的EventExecutorGroup。它與通常的線程池沒有什麼不同。如果線程池忙,任何嘗試執行長時間運行的任務都將排隊。

+1

我的擔心主要是關於堅持單線程模式。在古典線程池中,只要不是所有線程都被阻塞,就會發生進度。但是,如果幾個任務(事件)綁定到相同的特定線程,那麼即使該池中仍有空閒的線程,它們也可能會阻塞對方(排隊)。例如Doug Lea的ForkJoinPool通過利用工作竊取來避免這種情況。 – user1752169

2

你兩點也確實與Netty的3

的Netty 3有老闆和工作線程的概念。老闆線程負責接受新的連接,然後卸載到工作線程。 創建NioServerSocketChannelFactory時,可以配置工作線程的數量。

現在Netty 4已經分別由父事件循環和子事件循環取代了這些boss和worker線程。 但核心思想保持不變:爲了擺脫線程連接線程模型,您必須爲線程分配多個連接。
所以當你創建一個服務器時,將會有一個固定的N個線程池專用於處理連接。如果連接數低於N,則每個線程的連接數不會超過一個。另一方面,如果你有超過N個連接,一些線程將管理多個連接。這是以循環方式完成的,檢查出MultithreadEventExecutorGroup.next()