2015-06-04 29 views
8

儘管是單線程的,node.js如何更快? 我還沒有運行任何測試來查找統計信息,但在挖掘node.js論壇時,我發現每個人都說它更快,更輕量。但是不管它的重量如何輕微,單線程服務器如何比多線程服務器更快?爲什麼node.js在單線程時速度很快?

+8

比較快? –

+1

@LaurentB它在服務器上肯定比在瀏覽器中更快...... – Glorfindel

+0

我還有另外一個混亂@DenysSéguret。節點起作用,它啓動一些IO並分配一個回調。現在一旦OS完成該過程,誰調用回調?這是事件循環嗎?如果是的話,比起事件循環來管理那些成千上萬回調的那些數據庫不是一個錯誤嗎?爲什麼事件循環不是多線程的? –

回答

19

首先,爲什麼多線程程序更快?

部分原因是多線程程序可以在多核上運行,但主要原因是,當一個線程正在等待一些IO操作時(這通常是特別在服務器上),其他線程仍然可以進行。

現在,節點呢?

節點不是單線程的。 JS中的用戶腳本在一個線程中執行,但所有IO操作都由引擎和操作系統本地處理,這些線程是多線程

More explanation here

實際上,這意味着多個請求並行處理。這裏有一個動作可能的序列非常(非常)簡單例子:

user script      | node + OS "threads" (libuv) 
------------------------------------------------------------- 
receive and analyze request 1 | 
ask node for file 1    | fetching file 1 
receive and analyze request 2 | fetching file 1 
ask node for file 2    | fetching file 1, fetching file 2 
prepare response header 1  | fetching file 2 
tell node to send file 1  | send file 1, fetching file 2 
prepare response header 2  | send file 1 
tell node to send file 2  | send file 1, send file 2 

節點(和io.js)的整個架構簡化了具有並行的較高水平。用戶線程僅由事件循環調用,用於在代碼向節點提供回調時在下一次IO操作時停止的非常短的任務(當然,並非只是IO,而是最常見的),該回調將在操作完成時調用。

當然,這隻適用於使用Node的異步功能。任何時候你使用一個以「Sync」結尾的函數,比如writeFileSync,你就會擊敗並行。

+0

另請閱讀[StrongLoop:爲什麼使節點比Java快](https:// strongloop。com/strongblog/node-js-is-faster-java /) –

+0

感謝你@Denys的解釋和鏈接。它有幫助。 –

4

的Node.js並非單線程:看https://nodejs.org/about/

任何連接可以同時

辦理事實上,它不使用系統線程,而是沿着使用V8引擎與libuv多線程通過異步回調。

此外,您還可以通過child_process.fork

使用額外的子進程最後,這並不發動機的響應或整體速度的任何條件速度。這裏的多線程可用於可擴展性

相關問題