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