天天看點

Node.js 的單線程事件驅動模型和内置的線程池模型

建構在 node.js 之上的應用程式使用單線程事件循環模型架構來處理多個并發用戶端,如 JSP、Spring MVC、ASP.NET、HTML、Ajax、jQuery 等。存在其他可以使用的 web 技術,但這些列出的技術遵循“多線程請求-響應”架構來處理多個并發用戶端。

單線程:Node JS 平台不遵循多線程請求/響應無狀态模型。 它遵循單線程與事件循環模型。 Node JS Processing 模型主要受 JavaScript 基于事件的模型的啟發,具有 JavaScript 回調機制。 是以,Node.js 可以輕松處理更多并發用戶端請求。事件循環是 Node.js 處理模型的核心,如下圖所示。

Node.js 的單線程事件驅動模型和内置的線程池模型

n = 用戶端對 Node.js Web 伺服器的請求數。

假設他們同時通路我們建構在 Node.js 之上的 Web 應用程式用戶端是 Client-1, Client-2 。 . . 用戶端-n。

m = 線程池中的線程數。

Web 伺服器接收 Client-1, Client-2 。 . . 直到 Client-n 請求并将它們放入事件隊列中。

單線程事件循環相對于多線程請求/響應無狀态模型的優勢:

可以輕松處理越來越多的并發用戶端請求。

由于事件循環,無需建立越來越多的線程。

建構在 node.js 之上的應用程式使用盡可能少的線程來減少記憶體或資源使用。

node.js 使用單線程事件循環模型架構的原因:

最初,node.js 是作為異步處理的實驗而建立的,理論上,在應用程式不使用 CPU 時,在單個線程上進行異步處理可以在典型的 Web 負載下提供比典型的基于線程的實作更高的性能和可擴充性密集的東西,并且可以運作比 Apache 或 IIS 或其他基于線程的伺服器多數千個并發連接配接。

node.js 的單線程、異步特性也确實使事情變得複雜,但在設計應用程式所花費的時間、開發成本、死鎖、優先級倒置以及所有應用程式的生命周期問題方面,線程比這更糟糕。

對于伺服器的每個請求用一個線程來響應的模型還有一個衆所周知且備受批評的問題,即與事件循環線程模型相比,它們在多種場景下的擴充性不佳,簡而言之,它們缺乏作為應用程式的可擴充性不斷增長以滿足未來的需求并增加新功能。

由于 Node.js 遵循單線程事件循環模型,其靈感來自 JavaScript 基于事件的模型和 JavaScript 回調機制。是以,node.js 是類似于 JavaScript 的單線程,但不是純 JavaScript 代碼,這意味着像網絡調用、檔案系統任務、DNS 查找等異步完成的事情實際上并不由主線程處理。

How the single threaded non blocking IO model works in NodeJS ?

示例:如果我們收到來自兩個使用者 A 和 B 的請求。通過非阻塞 IO,我們可以發起對 A 的請求,然後立即對 B 發起請求,而無需等待對 A 請求的響應。是以我們可以說借助 non -blocking IO 我們可以消除多線程的使用,因為節點伺服器可以同時處理多個請求。

Working of single-threaded non-blocking IO:

Node.js 的單線程事件驅動模型和内置的線程池模型