當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
理解NodeJS
# 理解NodeJS近幾年Node被炒的火熱,總應(yīng)該了解一下Node是什么?能解決什么問題?## Node是什么?
Node是運行在服務(wù)器上的JavaScript解釋器,可以理解為服務(wù)器上并且可以解釋JavaScript的虛擬機。Node的優(yōu)勢在于異步運行,伸縮性好。此外,JavaScript可以在前后端運行,有利于統(tǒng)一代碼格式。## 為什么用Node?Node官方稱,“可以創(chuàng)建快速地、可伸縮的網(wǎng)絡(luò)應(yīng)用”。與Java和PHP等服務(wù)端語言不同的是,Node使用的是事件驅(qū)動,非阻塞的IO模型能夠讓Node高效運行,尤其適用于對數(shù)據(jù)敏感的實時應(yīng)用,比如微博、微信等。**事件驅(qū)動**事件驅(qū)動編程模型,是根據(jù)事件做出響應(yīng)。為程序運行過程中遇到的事件綁定響應(yīng)函數(shù),那么每當這個事件被觸發(fā)時,都可以做出相應(yīng)的響應(yīng)。例如瀏覽器向服務(wù)器請求某個頁面,服務(wù)器獲得請求之后,需要先讀取這個頁面相應(yīng)的內(nèi)容,并發(fā)送給瀏覽器。服務(wù)器在等待頁面讀取的過程中,就會浪費幾毫秒,雖然幾毫秒對于瀏覽器而言不重要,而對于處理大量請求的服務(wù)器就很可觀了。在事件驅(qū)動模型中,只要定義了獲得請求后的處理函數(shù)和讀取頁面完成的響應(yīng)函數(shù),那么在讀取頁面內(nèi)容的過程中,服務(wù)器還可以處理其他請求。當頁面讀取完成后,再將頁面內(nèi)容返回給瀏覽器。如果對于有大量IO的服務(wù)器而言,事件驅(qū)動的編程模型就十分重要。事件驅(qū)動的編程模型并不新鮮,但是卻能給應(yīng)用程序帶來性能的很大的提升,是因為事件驅(qū)動避免了阻塞狀態(tài)。順序執(zhí)行的代碼,每次調(diào)用其他模塊的代碼,都要等待其他模塊返回結(jié)果,這就是阻塞狀態(tài)。應(yīng)用程序總會調(diào)用其他模塊,也總會出現(xiàn)阻塞狀態(tài),必然降低程序的執(zhí)行效率。在本地應(yīng)用中,多線程很好的解決了這一問題。如果某個作業(yè)執(zhí)行時間長,那么就給他另行分配一個線程。這樣耗時長的作業(yè)不會影響到整個應(yīng)用的執(zhí)行效率。而在服務(wù)器中,為很多應(yīng)用服務(wù),需要處理很多鏈接和請求。因此通常會為每個鏈接分配一個線程,多線程在服務(wù)器編程中變得十分常見。然而在網(wǎng)絡(luò)應(yīng)用中,多線程并沒有真正解決阻塞的問題。每個線程都分配了相應(yīng)的內(nèi)存和CPU時間,每個線程服務(wù)于某一個連接。然而對于某一個線程而言,服務(wù)的狀態(tài)也會存在阻塞,比如在等待客戶端回應(yīng)的時間里。**多線程實現(xiàn)的非阻塞網(wǎng)絡(luò)連接和事件驅(qū)動的非阻塞網(wǎng)絡(luò)連接**多線程的網(wǎng)絡(luò)連接可以避免等待頁面讀取、數(shù)據(jù)庫查詢等處理過程的阻塞,可以提高服務(wù)器的響應(yīng)速度。但是這并不意味著這就是最好的實現(xiàn)方式。比如在Java實現(xiàn)的服務(wù)器上,為每個session分配一個線程,而每個線程需要占據(jù)2M的內(nèi)存。對于一個8G內(nèi)存的服務(wù)器,理論上能夠同時服務(wù)4000個用戶。但是隨著客戶群的增長,必須要配置更多的服務(wù)器,服務(wù)器的成本會越來越高。那么這么Web應(yīng)用的瓶頸就是,服務(wù)器能夠處理的并發(fā)連接的最大數(shù)量。Node是如何解決高并發(fā)的問題的呢?Node不會為每一個連接分配一個線程,而是每個連接、每個請求都觸發(fā)一個事件。Node在進程中不斷的處理事件,沒有阻塞I/O的調(diào)用,也沒有線程之間的輪詢。因此,Node服務(wù)器被認為有能力處理數(shù)萬個并發(fā)連接的程序。## Node如何工作?
Node是在V8引擎上運行的服務(wù)器,V8是用于Chrome的JavaScript引擎,C++實現(xiàn)的超快的JavaScript解釋器。只要有強大的解釋器支持,服務(wù)器端和客戶端都一樣,同樣可以有JavaScript處理各類事件。而且JavaScript在服務(wù)器端有更重要的優(yōu)勢,JavaScript是事件驅(qū)動的編程語言。利用匿名函數(shù),JavaScript很容易實現(xiàn)事件驅(qū)動的Web服務(wù)器。而且JavaScript更容易編寫,只需要監(jiān)聽各類事件,編寫相應(yīng)的回調(diào)函數(shù),剩下的都由系統(tǒng)處理。**參考:**[NodeJS入門](http://www.nodebeginner.org/index-zh-cn.html)[Node.js 究竟是什么?](http://www.ibm.com/developerworks/cn/opensource/os-nodejs/)[被誤解的 Node.js](http://www.ibm.com/developerworks/cn/web/1201_wangqf_nodejs/)
轉(zhuǎn)載于:https://www.cnblogs.com/hongyanee/p/3450290.html
總結(jié)
- 上一篇: 地址转换协议ARP
- 下一篇: 转: ajax跨域之JSONP