nodejs是什么
nodejs是js runtime
使用事件驅(qū)動 和 非阻塞I/O 模型
非阻塞I/O
阻塞: I/O時進(jìn)程等待I/O完成時進(jìn)行下一步
非阻塞: I/O時函數(shù)立即返回,進(jìn)程不等待I/O完成 (異步的感覺)
事件驅(qū)動
- I/O等異步操作結(jié)束后的通知(遇到I/O,不等I/O執(zhí)行完直接執(zhí)行下面程序,等其執(zhí)行完發(fā)射一個事件,對事件找其相應(yīng)的處理程序)
- 觀察者模式
為什么偏愛nodejs
- 前端職責(zé)范圍變廣
- 適合I/O密集,高并發(fā)
cpu密集: 壓縮,解壓,加密,解密
I/O密集: 文件操作,網(wǎng)絡(luò)操作,數(shù)據(jù)庫
web常用場景
- 靜態(tài)資源讀取
- 數(shù)據(jù)庫操作
- 渲染頁面
高并發(fā)應(yīng)對之道
高并發(fā): 單位時間訪問量很大
- 增加機(jī)器數(shù)
- 增加每臺機(jī)器的cpu數(shù) - 多核
進(jìn)程
- 進(jìn)程: 計算中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位
- 多進(jìn)程: 啟動多個進(jìn)程,多個進(jìn)程可以一塊執(zhí)行多任務(wù)
nodejs工作模型
cpu處理 -> I/O
cpu處理的速度遠(yuǎn)遠(yuǎn)大于I/O的
cpu相當(dāng)于服務(wù)員 I/O相當(dāng)于大廚 一個大廚對應(yīng)一個服務(wù)員
這樣其實(shí)減少服務(wù)員 減少到一個 就是開一個進(jìn)程
這樣沒有占用cpu
線程
線程 :進(jìn)程內(nèi)一個相對獨(dú)立的,可調(diào)度的執(zhí)行單元,與同屬一個進(jìn)程的線程共享進(jìn)程的資源
多線程: 啟動一個進(jìn)程,在一個進(jìn)程內(nèi)啟動多個線程,這樣多個線程也可以一塊執(zhí)行多個任務(wù)
nodejs的單線程
- 單線程只是針對主進(jìn)程,I/O操作系統(tǒng)底層多線程調(diào)度
- 單線程不是單進(jìn)程
nodejs常用場景
- web server
- 本地代碼構(gòu)建
- 實(shí)用工具開發(fā)(小爬蟲,但不是最佳的)