做爲異步事件驅動的JavaScript運行時,Node旨在構建可伸縮的網絡應用程序,在下面的「hello world」示例中,能夠同時處理許多鏈接,在每次鏈接時都會觸發回調,可是若是沒有工做要作,Node將會休眠。git
const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
這與目前使用OS線程的更常見的併發模型造成對比,基於線程的網絡效率相對較低且很是難以使用,此外,Node的用戶沒必要擔憂死鎖,由於沒有鎖。Node中幾乎沒有任何函數直接執行I/O,所以進程永遠不會阻塞,因爲沒有任何阻塞,可擴展系統在Node中開發很是合理。github
若是不熟悉這種語言,有一篇關於阻塞與非阻塞的完整文章。segmentfault
Node在設計上與Ruby的Event Machine或Python的Twisted等系統相似,並受其影響,Node進一步採用事件模型。它將事件循環呈現爲運行時構造而不是庫,在其餘系統中,始終存在阻塞調用以啓動事件循環。一般,行爲是經過腳本開頭的回調來定義的,最後經過阻塞調用來啓動服務器,如EventMachine::run()
。Node在執行輸入腳本後簡單地進入事件循環,當沒有更多回調要執行時,Node退出事件循環,此行爲相似於瀏覽器JavaScript — 事件循環對用戶隱藏。瀏覽器
HTTP是Node中的一等公民,設計時考慮了流媒體和低延遲,這使得Node很是適合Web庫或框架的基礎。服務器
僅僅由於Node沒有線程設計,並不意味着你沒法利用環境中的多個核心優點,子進程能夠經過使用咱們的child_process.fork()
API生成,而且設計爲易於與之通訊,基於相同的接口構建的是羣集模塊,它容許你在進程之間共享sockets,以便在覈心上實現負載平衡。網絡