假設單核心CPU下安裝一個node程式, 程式裡面很簡單, 一個http伺服器, 有請求進來, 延遲5秒回傳結果(可以理解了5s同步做一些事情)
當有3個請求同時進來時, 請問結果會是哪個場景:場景1:第一個請求在5秒後拿到結果, 第二個和第三個是在10s和15s後拿到結果場景2:所有請求都是5秒後拿到結果
如果換成java tomcat, 會是哪一個場景, 謝謝大家!
如果是 同步的 延遲 5秒,且 node.js 為簡單的單執行緒運行,不加入 cluster 等最佳化
同步的
const start = Date.now(); while(Date.now() - start < 5000) { ; } return res.send();
那麼,多個請求同時啟動時,場景1
但通常在 node.js 很少真的碰到完全阻塞的同步等待 5 秒,如果是下列情況:
同步等待 5 秒
setTimeOut(() => { return res.send(); }, 5000);
那結果當然是场景2
场景2
至於 Java ,並發是多線程支撐的,在機能足夠的情況下,比如並發僅為3,可以粗略的視為是:場景2。當然由於涉及線程開銷,在並發量上升之後,其記憶體的佔用將遠超 node.js 的模型
其實這也是為什麼我們說 node.js 比較適合 IO密集 低運算 的場景。可以參考我的另一個回答
如果是
同步的
延遲 5秒,且 node.js 為簡單的單執行緒運行,不加入 cluster 等最佳化那麼,多個請求同時啟動時,場景1
但通常在 node.js 很少真的碰到完全阻塞的
同步等待 5 秒
,如果是下列情況:那結果當然是
场景2
至於 Java ,並發是多線程支撐的,在機能足夠的情況下,比如並發僅為3,可以粗略的視為是:場景2。當然由於涉及線程開銷,在並發量上升之後,其記憶體的佔用將遠超 node.js 的模型
其實這也是為什麼我們說 node.js 比較適合 IO密集 低運算 的場景。可以參考我的另一個回答