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