Nodejs从小工到专家系列(一)
前言
從小工到專家系列為從頭開始學習Nodejs,但它并不是教程,我會整理一些應該特別注意或深入理解的知識點,當然也會涉及常用的庫,比如Express,mongoose,bluebird..
Nodejs特點:
單線程
優(yōu)點:
沒有死鎖存在
沒有線程上下文交換所產(chǎn)生的性能開銷
缺點:
無法利用多核
錯誤會引起整個應用退出,健壯性不高
大量計算占用CPU導致無法繼續(xù)調用異步I/O
解決方案:
引入child_process,大量計算時可以將計算分發(fā)到子進程,緩解壓力
進程之間通過事件消息傳遞結果
跨平臺
兼容Windows和*nix.在操作系統(tǒng)與Node上層模塊之間構建一層平臺層架構,即libuv
效率高
V8引擎
V8是谷歌開發(fā)的,目前公認最快的 Javascript 解析引擎,libuv 是一個開源的、為 Node 定制而生的跨平臺的異步 IO 庫。
高性能
采用事件循環(huán),而不是為每個連接分配一個線程
應用場景
對實時和并發(fā)有很高要求的,比如游戲,聊天等等
非阻塞I/O
操作系統(tǒng)內(nèi)核對于I/O只有兩種方式:阻塞與非阻塞.在調用阻塞IO時,應用程序需要等待I/O完成才能返回結果.
阻塞I/O造成CPU等待I/O,浪費等待時間,CPU的處理能力不能得到充分利用.為了提高性能,內(nèi)核提供了非阻塞I/O.非阻塞I/O會在調用后立即返回.
上面的立即如何理解呢?
因為阻塞I/O完成了整個獲取數(shù)據(jù)的過程,而非阻塞I/O則不帶數(shù)據(jù)直接返回,要獲取數(shù)據(jù),還需要通過文件描述符再次讀取.
文件描述符類似于應用程序與系統(tǒng)內(nèi)核之間的憑證.如果應用程序需要進行I/O調用,需要先打開文件描述符,然后在根據(jù)文件描述符去實現(xiàn)數(shù)據(jù)的讀寫
但非阻塞I/O存在些問題,它立即返回的并不是業(yè)務層期望的數(shù)據(jù),而僅僅是當前調用的狀態(tài).為了獲取完整的數(shù)據(jù),應用程序需要重復調用I/O操作來確認是否完成.這種重復調用判斷操作是否完成的技術叫做輪詢
異步I/O
事件循環(huán)
在進程啟動時,Node會創(chuàng)建一個類似與while(true)的循環(huán),它的作用就是產(chǎn)看是否有事件待處理,如果有就取出并處理,直到?jīng)]有就退出進程.
觀察者
如何知道是否有事件待處理呢,就引入了觀察者.再Node中觀察者包括文件I/O觀察者和網(wǎng)絡觀察者等.相當于一個探哨的.
請求對象
當我們要從自己寫的js到系統(tǒng)進行調用,會經(jīng)歷一個過程js->Node核心模塊->C++內(nèi)建模塊->libuv->系統(tǒng),那么傳遞參數(shù)信息就會利用一個請求對象,包括回調函數(shù)也在里面.
請求對象是非常重要的中間產(chǎn)物,所有的狀態(tài)都保存再這個對象中,包括送入線程池等待執(zhí)行及I/O操作完畢后的回調處理.
執(zhí)行回調
組裝好請求對象,送入I/O線程池等待執(zhí)行,實際上完成了異步I/O的第一部分,回調通知是第二部分.I/O觀察者回調函數(shù)的行為就是取出處理后返回的結果,以此達到調用JavaScript中傳入的回調函數(shù)的目的.
總結
以上是生活随笔為你收集整理的Nodejs从小工到专家系列(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言学习笔记(4)
- 下一篇: JavaScript动画知多少?