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