來自node.js背景,我很困惑它不像Netty中的單線程那樣在node.js中。 (NioServerSocketChannelFactory文檔指出存在boss線程和工作線程)爲什麼Netty需要線程池?
也許是因爲與node.js不同,許多現有的Java庫不是異步的。但即使是這樣,爲什麼不讓用戶根據需要創建線程呢?它是不是更自然,在概念上與異步事件驅動架構相一致?
來自node.js背景,我很困惑它不像Netty中的單線程那樣在node.js中。 (NioServerSocketChannelFactory文檔指出存在boss線程和工作線程)爲什麼Netty需要線程池?
也許是因爲與node.js不同,許多現有的Java庫不是異步的。但即使是這樣,爲什麼不讓用戶根據需要創建線程呢?它是不是更自然,在概念上與異步事件驅動架構相一致?
我對node.js和javascript的瞭解相對有限,但不是node.js受限於javascript不支持多線程的事實嗎?
在Netty中使用boss和worker線程是關於能夠利用多個處理器核心而不需要運行多個進程。 JVM很重,因此限制所需實例的數量是有意義的。另外我懷疑操作系統在線程之間切換要比完整的過程快得多。
Boss線程用於接受傳入的連接,但連接的處理被傳遞給工作線程。我沒有參考手,但我不記得Grizzly項目發佈的一些性能結果顯示,這是比試圖接受傳入連接,並在同一線程中處理這些連接更高性能。
接受的連接以循環方式在工作線程上進行負載平衡。除非您明確編寫代碼,否則工作線程不會彼此交互。因此,工作線程模型與我對node.js的理解非常相似。
Netty通過提供允許應用程序通過線程池定義線程模型的機制來處理非異步庫,線程池獨立於boss和worker線程。爲了解決這個問題,Netty還提供了一些自定義線程池,它們可以知道給定連接使用的內存資源,還可以保證連接產生的事件順序。但是,沒有必要使用這些機制。應用程序可以自由使用任何最適合的線程模型。
請注意,我的答案適用於Netty 3. Netty 4已經發生了重大變化,包括能夠使用相同的線程接受傳入連接並處理I/O(如果需要)。應用程序還可以選擇哪個I/O線程處理特定通道的事件,而不是僅限於純循環負載平衡。話雖如此,boss和工作者線程的分離仍然可以應用於Netty 4。 – johnstlr