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