加勒比HEZYO黑人专区-久久精品国产99国产精品亚洲-精品国产18久久久久久-久久人妻少妇嫩草AV

歡迎光臨 織晶網絡官網!

  • 服務支持
  • 020-39182790
技術文檔您現在的位置:首頁 > 服務支持 > 技術文檔

Node.js特點與應用場景

作者:織晶客服部   發布于:2020/9/3 19:44:19  點擊量:  來源:織晶網絡

特點

作為后端JavaScript的運行平臺,Node保留了前端瀏覽器JavaScript中那些熟悉的接口,沒有改寫語言本身的任何特性,依舊基于作用域和原型鏈,區別在于它將前端中廣泛運用的思想遷移到了服務器端。Node相較于其他語言的特點如下所示:

1、異步I/O
在Node中,絕大多數的操作都以異步的方式進行調用。Ryan Dahl排除萬難,在底層構建了很多異步I/O的API,從文件讀取到網絡請求等,均是如此。這樣的意義在于,在Node中,我們可 以從語言層面很自然地進行并行I/O操作。每個調用之間無須等待之前的I/O調用結束。在編程模型上可以極大提升效率。

以同時執行兩個文件讀取任務為例,異步I/O取決于最慢的那個文件讀取的耗時,而同步I/O的耗時是兩個任務的耗時之和。這里異步帶來的優勢是顯而易見的。

2、事件
隨著Web 2.0時代的到來,JavaScript在前端擔任了更多的職責,事件也得到了廣泛的應用。 Node不像Rhino那樣受Java的影響很大,而是將前端瀏覽器中應用廣泛且成熟的事件引入后端, 配合異步I/O,將事件點暴露給業務邏輯。

事件的編程方式具有輕量級、松耦合、只關注事務點等優勢,但是在多個異步任務的場景下,事件與事件之間各自獨立,如何協作是一個問題。

3、回調函數
與其他的Web后端編程語言相比,Node除了異步和事件外,回調函數是一大特色。縱觀下來,回調函數也是最好的接受異步調用返回數據的方式。但是這種編程方式對于很多習慣同步思路編程的人來說,也許是十分不習慣的。代碼的編寫順序與執行順序并無關系,這對他們可能造成閱讀上的障礙。在流程控制方面,因為穿插了異步方法和回調函數,與常規的同步方式相比,變得不那么一目了然了。

4、單線程
JavaScript語言的一大特點就是單線程,也就是說,同一個時間只能做一件事。JavaScript的單線程,與它的用途有關。作為瀏覽器腳本語言,JavaScript的主要用途是與用戶互動,以及操作DOM。這決定了它只能是單線程,否則會帶來很復雜的同步問題。比如,假定JavaScript同時有兩個線程,一個線程在某個DOM節點上添加內容,另一個線程刪除了這個節點,這時瀏覽器應該以哪個線程為準?所以,為了避免復雜性,從一誕生,JavaScript就是單線程,這已經成了這門語言的核心特征。

Node保持了JavaScript在瀏覽器中單線程的特點。而且在Node中,JavaScript與其余線程是無法共享任何狀態的。單線程的最大好處是不用像多線程編程那樣處處在意狀態的同步問題,這里沒有死鎖的存在,也沒有線程上下文交換所帶來的性能上的開銷。

同樣,單線程也有它自身的弱點,具體有以下3方面:無法利用多核CPU;錯誤會引起整個應用退出,應用的健壯性值得考驗;大量計算占用CPU導致無法繼續調用異步I/O。

像瀏覽器中JavaScript與UI共用一個線程一樣,JavaScript長時間執行會導致UI的渲染和響應被中斷。在Node中,長時間的CPU占用也會導致后續的異步I/O發不出調用,已完成的異步I/O的回調函數也會得不到及時執行。
HTML5定制了Web Workers的標準,Web Workers能夠創建工作線程來進行計算,以解決JavaScript大計算阻塞UI渲染的問題。工作線程為了不阻塞主線程,通過消息傳遞的方式來傳遞運行結果,這也使得工作線程不能訪問到主線程中的UI。

Node采用了與Web Workers相同的思路來解決單線程中大計算量的問題:child_process。 子進程的出現,意味著Node可以從容地應對單線程在健壯性和無法利用多核CPU方面的問題。通過將計算分發到各個子進程,可以將大量計算分解掉,然后再通過進程之間的事件消息來傳遞結果,這可以很好地保持應用模型的簡單和低依賴。通過Master-Worker的管理方式,也可以很好地管理各個工作進程,以達到更高的健壯性。


應用場景

在進行技術選型之前,需要了解一項新技術具體適合什么樣的場景,畢竟合適的技術用在合適的場景可以起到意想不到的效果。關于Node,探討得較多的主要有I/O密集型和CPU密集型。

1、I/O密集型
如果將所有的腳本語言拿到一處來評判,那么從單線程的角度來說,Node處理I/O的能力是值得豎起拇指稱贊的。通常, 說Node擅長I/O密集型的應用場景基本上是沒人反對的。Node面向網絡且擅長并行I/O,能夠有效地組織起更多的硬件資源,從而提供更多好的服務。
I/O密集的優勢主要在于Node利用事件循環的處理能力,而不是啟動每一個線程為每一個請求服務,資源占用極少

2、CPU密集型
換一個角度,在CPU密集的應用場景中,Node是否能勝任呢?實際上,V8的執行效率是十分高的。單以執行效率來做評判,V8的執行效率是毋庸置疑的。
CPU密集型應用給Node帶來的挑戰主要是:由于JavaScript單線程的原因,如果有長時間運行的計算(比如大循環),將會導致CPU時間片不能釋放,使得后續I/O無法發起。但是適當調整和分解大型運算任務為多個小任務,使得運算能夠適時釋放,不阻塞I/O調用的發起,這樣既可同時享受到并行異步I/O的好處,又能充分利用CPU。



上一篇:JS之給元素添加類的方法

下一篇:網頁前端HTML、JS、CSS應用的主要知識點