并行處理-node.js如何工作?

我不了解關于nodejs的幾件事。 每個信息來源都說,由于缺少線程鎖定和上下文切換,node.js比標準線程化Web服務器具有更高的可伸縮性,但是我想知道,如果node.js不使用線程,它將如何并行處理并發請求? 事件I / O模型意味著什么?

非常感謝您的幫助。謝謝

asked 2020-02-20T23:46:35Z
3個解決方案
80 votes

節點完全是事件驅動的。 基本上,服務器由一個線程處理一個事件接著另一個事件組成。

一個新的請求進入是一種事件。 服務器開始處理它,并且當發生阻塞的IO操作時,它不會等到完成后才注冊回調函數。 然后,服務器立即開始處理另一個事件(可能是另一個請求)。 IO操作完成后,這是另一種事件,服務器將在有時間的時候通過執行回調來處理它(即繼續處理請求)。

因此,服務器無需創建其他線程或在線程之間切換,這意味著其開銷很小。 如果要充分利用多個硬件核心,只需啟動node.js的多個實例

更新資料在最低級別(C ++代碼,而不是Javascript),node.js中實際上有多個線程:有一個IO工作器池,其工作是接收IO中斷并將相應的事件放入隊列中,以供處理 主線程。 這樣可以防止主線程被中斷。

answered 2020-02-21T00:00:17Z
2 votes

盡管問題已經很長時間解釋過了,但我的想法還是一樣。

Node JS是單線程技術。 基本上,Node JS創建者(Ryan Dahl)擔心的是使用多個線程的并行處理不是正確的方法,也不是太復雜。

如果node.js不使用線程,它將如何并行處理并發請求

回答:當您說它不使用線程時,這是完全錯誤的句子可以领救济金的游戏,Node Js使用線程但是以一種聰明的方式使用。 它使用單線程服務所有HTTP請求,并在線程池(libuv)中使用多個線程來處理任何阻塞操作

Libuv:處理異步I / O的庫。

事件I / O模型意味著什么?

回答:正確的術語是非阻塞I / O。 正如Node JS官方網站所說,它幾乎永遠不會阻塞。 當任何請求發送到節點服務器時,它永遠不會將請求排隊。 它接受請求并開始執行(如果它阻塞了操作),然后將其發送到工作線程區域,并在代碼執行完成后立即為該線程注冊一個回調,然后觸發相同的回調并進入事件隊列,并在之后再次由事件循環處理 創建響應并發送到相應的客戶端。

有用的鏈接:點擊這里

answered 2020-02-21T00:01:09Z
2 votes

Node JS是一個JavaScript運行時環境。瀏覽器和Node JS都在V8 JavaScript引擎上運行。 Node JS使用事件驅動的非阻塞I / O模型,從而使其輕巧高效。 Node JS應用程序使用單線程事件循環體系結構來處理并發客戶端。實際上,它的主事件循環是單線程的,但是大多數I / O在單獨的線程上工作,因為Node JS中的I / O API在設計上是異步/非阻塞的,以便適應主事件循環。考慮以下情形:我們請求后端數據庫獲取user1和user2的詳細信息,然后將它們打印在屏幕/控制臺上。對這個請求的響應需要時間,但是兩個用戶數據請求都可以獨立且同時執行。當100個人同時連接而不是擁有不同的線程時,Node將遍歷這些連接并觸發代碼應知道的任何事件。如果連接是新的,它將告訴您。如果連接發送了數據可以领救济金的游戏,則將告訴您。如果連接沒有執行任何操作,它將跳過該連接,而不是占用精確的CPU時間。 Node中的所有內容都基于對這些事件的響應。因此,我們可以看到結果,CPU專注于那個進程,并且沒有一堆線程需要注意。Node.JS應用程序中沒有緩沖,它只是簡單地以塊的形式輸出數據。

answered 2020-02-21T00:01:33Z
translate from