Nodejs核心機制

文章目錄

  • 前言


前言

結合 Node.js 的核心機制進行說明:


  1. 解釋事件循環的各個階段。
    答案
    Node.js 事件循環分為 6 個階段,按順序執行:

  2. Timers:執行 setTimeoutsetInterval 的回調。

  3. Pending I/O Callbacks:處理系統操作(如 TCP 錯誤)的回調。

  4. Idle/Prepare:Node.js 內部使用的階段。

  5. Poll:
    ? 檢索新的 I/O 事件并執行回調(如文件讀取、HTTP 請求)。

    ? 如果 Poll 隊列為空:

    ? 若有 setImmediate 回調,進入 Check 階段。

    ? 否則等待新的 I/O 事件。

  6. Check:執行 setImmediate 的回調。

  7. Close Callbacks:處理關閉事件的回調(如 socket.on('close'))。

解析
? 每個階段都是一個 FIFO 隊列,必須清空當前階段的回調才會進入下一階段。

? 重點:setTimeoutsetInterval 的回調不一定精確按時執行,因為 Poll 階段可能阻塞事件循環。


  1. setImmediatesetTimeout(fn, 0) 的區別是什么?
    答案
    ? 執行順序:

? 在主模塊中,兩者的執行順序不確定(受進程性能影響)。

? 在 I/O 回調(如 fs.readFile)中,setImmediate 總是先于 setTimeout

? 底層階段:

? setImmediate 在 Check 階段 執行。

? setTimeout 在 Timers 階段 執行。

示例代碼

fs.readFile('file.txt', () => {setTimeout(() => console.log('Timeout'), 0);setImmediate(() => console.log('Immediate'));
});
// 輸出順序:Immediate → Timeout

解析
? 在 I/O 回調中,事件循環處于 Poll 階段,執行完回調后優先進入 Check 階段(setImmediate),再進入 Timers 階段。


  1. 什么是事件驅動編程?Node.js 如何實現非阻塞 I/O?
    答案

? 事件驅動:通過監聽事件(如點擊、文件讀取完成)觸發回調,而非主動輪詢。

? 非阻塞 I/O 的實現:

? 操作系統級異步:網絡請求等由內核異步處理(通過 epollkqueue)。

? 線程池:文件 I/O 等阻塞操作由 libuv 的線程池處理,完成后通知主線程。

解析
? Node.js 的單線程僅指 JS 主線程,底層通過多線程 + 事件循環實現高并發。


  1. 如何監控和調試內存泄漏?
    答案

常見泄漏場景:

? 未清理的全局變量、閉包引用、定時器、事件監聽器(如 EventEmitter)。

調試工具:

? Chrome DevTools 的 Heap Snapshot 對比內存快照。

? 使用 --inspect 參數 + node-heapdump 模塊生成堆內存快照。

? 監控 process.memoryUsage()

解析
? 內存泄漏的本質是對象被意外保留,無法被 GC 回收。


  1. process.nextTicksetImmediate 的執行順序?
    答案
    ? process.nextTick

? 在事件循環的每個階段結束后立即執行(微任務)。

? 優先級高于 Promise.then()

? setImmediate

? 在 Check 階段執行(宏任務)。

執行順序:

Promise.resolve().then(() => console.log('Promise'));
process.nextTick(() => console.log('nextTick'));
setImmediate(() => console.log('Immediate'));
// 輸出順序:nextTick → Promise → Immediate

解析
? process.nextTick 會將回調插入當前階段末尾,而 setImmediate 是下一輪循環。


  1. Node.js 單線程模型如何處理并發請求?
    答案
    ? 非阻塞 I/O:主線程發起異步 I/O 操作后繼續處理其他任務,I/O 完成后通過事件循環觸發回調。

? 線程池:文件操作等阻塞任務由 libuv 的線程池處理(默認 4 個線程)。

解析
? 單線程避免了多線程的鎖競爭和上下文切換開銷,適合 I/O 密集型場景,但不適合 CPU 密集型任務。


  1. Cluster 模塊是如何工作的?
    答案
    ? 原理:Master 進程創建多個子進程(Worker),共享同一端口,通過輪詢(Round-Robin)分配請求。

? 代碼示例:

const cluster = require('cluster');
if (cluster.isMaster) {for (let i = 0; i < 4; i++) cluster.fork(); // 啟動 4 個 Worker
} else {require('./app.js'); // 每個 Worker 運行一個服務實例
}

解析
? 子進程通過 IPC(進程間通信)與 Master 進程通信。

? 優勢:利用多核 CPU,提高吞吐量。


  1. Buffer 和 Stream 的應用場景是什么?
    答案
    ? Buffer:處理二進制數據(如圖片、文件),避免字符串轉換的性能損耗。

? Stream:

? 大文件處理:分片讀取文件,避免內存溢出(如 fs.createReadStream)。

? 實時數據傳輸:HTTP 響應、TCP 套接字。

示例

// 使用 Stream 復制文件
fs.createReadStream('input.txt').pipe(fs.createWriteStream('output.txt'));

解析
? Stream 通過事件分塊處理數據,顯著降低內存占用。


總結
掌握這些問題的核心原理(事件循環、異步 I/O、內存管理)能讓你在面試中脫穎而出。建議結合以下實踐:

  1. 使用 node --trace-event-categories=node.async_hooks 跟蹤異步事件。
  2. 閱讀 libuv 文檔 和 Node.js 官方博客。
  3. 通過 WARTHOG(Node.js 性能分析工具)定位性能瓶頸。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80594.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++筆記6:數字字面量后綴和前綴總結

在C中&#xff0c;可以在數字字面量后面添加字母后綴&#xff08;或前綴&#xff09;來表示特定的數據類型。這些后綴能夠明確指定字面量的類型&#xff0c;避免類型轉換帶來的潛在問題。以下是常見的幾種類型后綴及其含義&#xff1a; 1. 整數后綴 u 或 U&#xff1a;表示 u…

50.輻射抗擾RS和傳導抗擾CS測試環境和干擾特征分析

輻射抗擾RS和傳到抗擾CS測試環境和干擾特征分析 1. 輻射抗擾RS2. 傳導抗擾CS 1. 輻射抗擾RS 輻射抗擾RS考察對外界電磁場干擾得抗擾能力&#xff0c;測試頻段為80MHz~2000MHz&#xff0c;用1KHz得正弦波進行調幅&#xff0c;在電波暗室內進行。測試標準&#xff1a;IEC 61000-…

Java多態詳解

Java多態詳解 什么是多態&#xff1f; 比如我們說&#xff1a;“駕駛一輛車”&#xff0c;有人開的是自行車&#xff0c;有人開的是摩托車&#xff0c;有人開的是汽車。雖然我們都說“開車”&#xff0c;但“怎么開”是由具體的車類型決定的&#xff1a;“開”是統一的動作&a…

問題及解決01-面板無法隨著窗口的放大而放大

在MATLAB的App Designer中&#xff0c;默認情況下&#xff0c;組件的位置是固定的&#xff0c;不會隨著父容器的大小變化而改變。問題圖如下圖所示。 解決&#xff1a; 為了讓Panel面板能夠隨著UIFigure父容器一起縮放&#xff0c;需要使用布局管理器&#xff0c;我利用 MATLA…

【GESP真題解析】第 20 集 GESP 二級 2025 年 3 月編程題 2:時間跨越

大家好,我是莫小特。 這篇文章給大家分享 GESP 二級 2025 年 3 月編程題第 2 題:時間跨越。 題目鏈接 洛谷鏈接:B4260 時間跨越 一、完成輸入 根據題意,輸入包含五行,每行一個正整數,分別代表 y,m,d,h,k。 注意到數據范圍:對于全部數據,保證有 2000≤y≤3000,1≤m≤…

GTS-400 系列運動控制器板卡介紹(二十一)---電子齒輪跟隨

運動控制器函數庫的使用 運動控制器驅動程序、dll 文件、例程、Demo 等相關文件請通過固高科技官網下載,網 址為:www.googoltech.com.cn/pro_view-3.html 1 Windows 系統下動態鏈接庫的使用 在 Windows 系統下使用運動控制器,首先要安裝驅動程序。在安裝前需要提前下載運動…

軟件工程之需求分析涉及的圖與工具

需求分析與規格說明書是一項十分艱巨復雜的工作。用戶與分析員之間需要溝通的內容非常的多&#xff0c;在雙方交流信息的過程中很容易出現誤解或遺漏&#xff0c;也可能存在二義性。如何才能更加準確的表達雙方的意思&#xff0c;且清楚明了&#xff0c;繪制各類圖形就顯得非常…

藍橋杯14屆 數三角

問題描述 小明在二維坐標系中放置了 n 個點&#xff0c;他想在其中選出一個包含三個點的子集&#xff0c;這三個點能組成三角形。然而這樣的方案太多了&#xff0c;他決定只選擇那些可以組成等腰三角形的方案。請幫他計算出一共有多少種選法可以組成等腰三角形&#xff1f; 輸…

在Fiddler中添加自定義HTTP方法列并高亮顯示

在Fiddler中添加自定義HTTP方法列并高亮顯示 Fiddler 是一款強大的 Web 調試代理工具&#xff0c;允許開發者檢查和操作 HTTP 流量。一個常見需求是自定義 Web Sessions 列表&#xff0c;添加顯示 HTTP 方法&#xff08;GET、POST 等&#xff09;的列&#xff0c;并通過顏色區…

數據庫分庫分表實戰指南:從原理到落地

1. 為什么要分庫分表&#xff1f; 1.1 單庫瓶頸表現 存儲瓶頸&#xff1a;單表數據超過5000萬行&#xff0c;查詢性能急劇下降性能瓶頸&#xff1a;單庫QPS超過5000后響應延遲顯著增加可用性風險&#xff1a;單點故障導致全系統不可用 1.2 突破性優勢 --------------------…

Selenium的driver.get_url 和 手動輸入網址, 并點擊的操作,有什么不同?

我在搞爬取的時候&#xff0c;發現有些網站直接用driver.get(url) 跳轉到目標特定的網址的時候&#xff0c;會被強制跳轉到其他的網址上&#xff0c;但是如果是自己手動&#xff0c;在網址欄那里輸入網址&#xff0c;并點回車&#xff0c;卻能完成跳轉。 這是在使用 Selenium …

Java【06】數組查找(二分查找)、排序(冒泡排序、簡單選擇排序)

1. 數組的操作 1.1 數組的反轉 int[] arrs{3,5,7,8,9}; 編寫程序&#xff0c;讓arrs中的數據進行反轉{9,8,7,5,3} 1.2數組的查找 ① 順序查找 從頭到尾一個一個的找&#xff01; ② 二分查找 對數組有一個要求&#xff1a;數組必須是有序(大小)的&#xff01; int num3; int[]…

Redis 基礎詳解:從入門到精通

在當今互聯網應用開發領域&#xff0c;數據存儲與處理的性能和效率至關重要。Redis&#xff08;Remote Dictionary Server&#xff09;作為一款開源的、基于內存的鍵值存儲系統&#xff0c;憑借其出色的性能和豐富的功能&#xff0c;被廣泛應用于數據庫、緩存、消息中間件等場景…

圖片轉ICO圖標工具

圖片轉ICO圖標 可批量操作 下載地址&#xff1a; 鏈接&#xff1a;https://pan.quark.cn/s/6312c565ec98 這個工具是一個批量圖片轉ICO圖標的神器&#xff0c;有了它&#xff0c;以后再也不用為ICO格式的轉換煩惱&#xff01;而且這個軟件特別小巧&#xff0c;完全不用安裝。…

0基礎 | L298N電機驅動模塊 | 使用指南

引言 在嵌入式系統開發中&#xff0c;電機驅動是一個常見且重要的功能。L298N是一款高電壓、大電流電機驅動芯片&#xff0c;廣泛應用于各種電機控制場景&#xff0c;如直流電機的正反轉、調速&#xff0c;以及步進電機的驅動等。本文將詳細介紹如何使用51單片機來控制L298N電…

Flink 系列之十五 - 高級概念 - 窗口

之前做過數據平臺&#xff0c;對于實時數據采集&#xff0c;使用了Flink。現在想想&#xff0c;在數據開發平臺中&#xff0c;Flink的身影幾乎無處不在&#xff0c;由于之前是邊用邊學&#xff0c;總體有點混亂&#xff0c;借此空隙&#xff0c;整理一下Flink的內容&#xff0c…

大疆卓馭嵌入式面經及參考答案

FreeRTOS 有哪 5 種內存管理方式&#xff1f; heap_1.c&#xff1a;這種方式簡單地在編譯時分配一塊固定大小的內存&#xff0c;在整個運行期間不會進行內存的動態分配和釋放。它適用于那些對內存使用需求非常明確且固定&#xff0c;不需要動態分配內存的場景&#xff0c;優點是…

Java 線程池原理

Java 線程池是一種管理和復用線程的機制&#xff0c;其原理如下&#xff1a; 核心概念 線程池的初始化 &#xff1a;在創建線程池時&#xff0c;需要設置一些關鍵參數&#xff0c;如核心線程數&#xff08;corePoolSize&#xff09;、最大線程數&#xff08;maximumPoolSize&am…

大模型都有哪些超參數

大模型的超參數是影響其訓練效果、性能和泛化能力的關鍵設置,可分為以下幾大類別并結合實際應用進行詳細說明: 一、訓練過程相關超參數 學習率(Learning Rate) 作用:控制參數更新的步長,直接影響收斂速度和穩定性。過高會導致震蕩或過擬合,過低則收斂緩慢。調整策略:初…

路由器斷流排查終極指南:從Ping測試到Wireshark抓包5步定位法

測試路由器是否出現“斷流”&#xff08;網絡連接間歇性中斷&#xff09;&#xff0c;需通過多維度排查硬件、軟件及外部干擾因素。以下是詳細步驟指南&#xff1a; 一、基礎環境準備 設備連接 有線測試&#xff1a;用網線將電腦直接連接路由器LAN口&#xff0c;排除WiFi干擾。…