2013-12-23 28 views
11

我還沒有經歷過node.js的代碼細節。Java NIO非阻塞模式vs node.js異步操作

但是,經過對Node.js中的線程的一些研究,我發現它有單線程接受來自多個客戶端的連接。

當與客戶端連接時,它觸發連接事件並偵聽另一個客戶端,並以異步方式完全工作,並且客戶端請求的休眠操作從線程池執行,結果通過回調被髮送回主線程(接受連接的線程) 。

與Java中的明智NIO還有ServerSocketChannel一樣,SocketChannel可以設置爲非阻塞模式,並且使用選擇器單線程可以監控多個通道。因此,使用NIO ServerSocketChannel,SocketChannel也可以從單線程連接可以異步管理多個客戶端

因此,NIO的非阻塞模式和node.js異步與單線程遵循相同的模式爲單線程的概念?正如他們所說,他們在單線程上執行。

+1

假設異步和非阻塞是類似的模式是常見的誤解。 Node.js也有非阻塞套接字操作。所以是的,這兩個框架都有非阻塞的IO,允許它們處理來自單個線程的多個優勢。 – user568109

回答

1

不是。非阻塞意味着操作不會阻止,並且他們會告訴您他們做了什麼。異步意味着他們的操作並行繼續並在完成時回撥。它們是完全不同的編程範例。

+0

我寫過這個問題http://stackoverflow.com/questions/35660710/if-a-web-server-is-non-blocking-does-this-mean-it-is-handling-io-the-same-as沒有,並想知道你是否認爲我在混淆同樣的東西。 – johnny

+0

@johhny是的,你是。 – EJP

4

異步一般而言,特別是NIO不一定支持單線程,它們可以被多個線程支持以提高性能。但是,多線程需要額外的同步(不復雜但精確)。由於JavaScript缺少同步工具,Node.js必須使用單線程。 Java異步框架可以使用多個線程。

附錄

爲什麼Node.js是單線程設計的?從Understanding Node.js

"So I don't have to worry about code accessing the same data 
structures at the same time?" 

You got it! That's the entire beauty of JavaScripts 
single-threaded/event loop design! 

所以單線程設計,最可能的原因是爲了取悅JavaScript程序員,其中,集體,不熟悉同步的概念。

+2

Node.js使用單線程,所以它不需要同步原語,而不是相反 – vkurchatkin

+0

@vkurchatkin我說錯了什麼,究竟是什麼? –

+0

你說node.js是單線程的原因是javascript缺少同步工具。這不是真的 - node.js是單線程的設計,所以它不需要它們。如果他們需要,他們可以實施,沒有什麼可以阻止它的JavaScript – vkurchatkin