關於Node.js
作為非同步事件驅動的JavaScript執行時,Node旨在構建可伸縮的網路應用程式,在下面的“hello world”示例中,可以同時處理許多連線,在每次連線時都會觸發回撥,但是如果沒有工作要做,Node將會休眠。
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
`);
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
這與目前使用OS執行緒的更常見的併發模型形成對比,基於執行緒的網路效率相對較低且非常難以使用,此外,Node的使用者不必擔心死鎖,因為沒有鎖。Node中幾乎沒有任何函式直接執行I/O,因此程式永遠不會阻塞,由於沒有任何阻塞,可擴充套件系統在Node中開發非常合理。
如果不熟悉這種語言,有一篇關於阻塞與非阻塞的完整文章。
Node在設計上與Ruby的Event Machine或Python的Twisted等系統類似,並受其影響,Node進一步採用事件模型。它將事件迴圈呈現為執行時構造而不是庫,在其他系統中,始終存在阻塞呼叫以啟動事件迴圈。通常,行為是通過指令碼開頭的回撥來定義的,最後通過阻塞呼叫來啟動伺服器,如EventMachine::run()
。Node在執行輸入指令碼後簡單地進入事件迴圈,當沒有更多回撥要執行時,Node退出事件迴圈,此行為類似於瀏覽器JavaScript — 事件迴圈對使用者隱藏。
HTTP是Node中的一等公民,設計時考慮了流媒體和低延遲,這使得Node非常適合Web庫或框架的基礎。
僅僅因為Node沒有執行緒設計,並不意味著你無法利用環境中的多個核心優勢,子程式可以通過使用我們的child_process.fork()
API生成,並且設計為易於與之通訊,基於相同的介面構建的是群集模組,它允許你在程式之間共享sockets,以便在核心上實現負載平衡。