原文地址:https://nodejs.org/en/about/
作為一個異步事件驅動javaScript執行環境,Node被設計來構建可擴展的網絡應用。在下面這個“hello world”示例中,可以同時處理許多并發連接。根據每個連接請求,Node將會調用對應的回調函數。如果沒有工作需要完成時,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/n');});server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`);});這種編程模型和如今使用廣泛的基于操作系統線程的并發編程模型行程了強烈的對比?;诰€程的網絡處理工作非常的低效并且難于使用。此外,Node開發人員得以從考慮各種進程死鎖中解放出來,因為Node中根本就沒有鎖。在Node中幾乎沒有方法會直接操作I/O,因此進程從來不會被阻塞。因為沒有阻塞,用Node開發可擴展的系統非常容易。 如果你覺得以上內容對你而言非常陌生,這里有一篇文章專門介紹“Blocking vs Non-Blocking”(阻塞式編程和非阻塞式編程:https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/)。
Node受到了Ruby的“Event Machine”和Python的“Twisted”非常多的影響,并且Node本身也和這兩種架構非常類似。在此基礎之上,Node對事件模型做了進一步的優化。Node在運行時通過事件循環(event loop)來進行主要操作。在其他系統中當事件處理機制觸發時總是伴隨著阻塞調用。在Node中我們會在腳本開頭通過回調定義系統的常規行為,并且在腳本末尾通過一個阻塞調用形如:EventMachine::run()
來啟動一個服務器。Node會在執行完輸入腳本后直接進入事件循環機制。當系統中沒有其他回調需要執行時,Node就會保持事件循環。這一特性正如瀏覽器中的Javascript執行環境—開發人員永遠也看不到事件循環機制的存在。 HTTP是Node中的第一類型,并被設計為流式(streaming)和低延遲。這個特性使得Node非常適用于作為網絡事務和系統框架來開發。 雖然Node在設計之初就盡可能規避線程這個概念,但這并不意味著你不能從多核環境中獲得優勢。子進程可以通過調用非常簡單的child_PRocess.fork()
API而被大量生產出來。另一個基于相同接口的cluster
模型,能提供你在進程間分享sockets連接來使你系統的多核能夠負載均衡。
新聞熱點
疑難解答