理解Node.js的event loop
生活随笔
收集整理的這篇文章主要介紹了
理解Node.js的event loop
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
關(guān)于Node.js的第一個(gè)基本概念是I/O操作開銷是巨大的:
所以,當(dāng)前變成技術(shù)中最大的浪費(fèi)來(lái)自于等待I/O操作的完成。有幾種方法可以解決性能的影響:
同步方式:按次序一個(gè)一個(gè)的處理請(qǐng)求。利:簡(jiǎn)單;弊:任何一個(gè)請(qǐng)求都可以阻塞其他所有請(qǐng)求。
開啟新進(jìn)程:每個(gè)請(qǐng)求都開啟一個(gè)新進(jìn)程。利:簡(jiǎn)單;弊:大量的鏈接意味著大量的進(jìn)程。
開啟新線程:每個(gè)請(qǐng)求都開啟一個(gè)新線程。利:簡(jiǎn)單,而且跟進(jìn)程比,對(duì)系統(tǒng)內(nèi)核更加友好,因?yàn)榫€程比進(jìn)程輕的多;弊:不是所有的機(jī)器都支持線程,而且對(duì)于要處理共享資源的情況,多線程編程會(huì)很快變得太過(guò)于復(fù)雜。
第二個(gè)基本概念是每個(gè)連接都創(chuàng)建一個(gè)新線程是很消耗內(nèi)存的(例如:你可以對(duì)比Nginx回想一下Apache內(nèi)存耗盡的情景)。Apache是多線程的:它為每個(gè)請(qǐng)求開啟一個(gè)新的線程(或者是進(jìn)程,這取決于你的配置),當(dāng)并發(fā)連接增多時(shí),你可以看看它是怎么一點(diǎn)一點(diǎn)耗盡內(nèi)存的。Nginx和Node.js不是多線程的,因?yàn)榫€程的消耗太“重”了。它們兩個(gè)是單線程、基于事件的,這就把處理眾多連接所產(chǎn)生的線程/進(jìn)程消耗給消除了。
Node.js中你的代碼運(yùn)行在單線程之中
確實(shí)只有一個(gè)線程:你不能并行執(zhí)行任何代碼,比如:下面的“sleep”將會(huì)阻塞sever1秒鐘:
while(new Date().getTime() < now + 1000) {// do nothing}
當(dāng)這段代碼運(yùn)行時(shí),Node.js不會(huì)響應(yīng)客戶端任何請(qǐng)求,因?yàn)橹挥幸粋€(gè)線程來(lái)運(yùn)行你的代碼,另外,如果你執(zhí)行cpu密集的任務(wù),比如重設(shè)圖像的大小,它也會(huì)阻塞所有請(qǐng)求。
……然而,除了你的代碼,其它的一切都是并行執(zhí)行的
單線程沒(méi)法讓代碼并行執(zhí)行。但是所有I/O操作都是事件驅(qū)動(dòng)、并行的,所以下面的代碼不會(huì)阻塞server:
????? ??
c.query('SELECT SLEEP(20);', function (err, results, fields) {if (err) {throw err;}res.writeHead(200, {'Content-Type': 'text/html'});res.end('Return from async DB query ');c.end();});
如果你在一次請(qǐng)求中執(zhí)行這些,當(dāng)數(shù)據(jù)庫(kù)sleep時(shí),其他請(qǐng)求也會(huì)立即被處理。
為什么異步比較好?什么時(shí)候我們應(yīng)該從同步轉(zhuǎn)移到異步/并行執(zhí)行呢?
同步執(zhí)行也不錯(cuò),因?yàn)樗?jiǎn)便了我們敲代碼。但在使用異步時(shí),你不必關(guān)心后端是怎么處理的。而且,在I/O操作時(shí)不會(huì)阻止其他請(qǐng)求,同時(shí)無(wú)需承擔(dān)每個(gè)請(qǐng)求所產(chǎn)生的線程/進(jìn)程的成本。I/O操作時(shí)使用異步處理很好,因?yàn)镮/O操作的成本比單純執(zhí)行代碼要高的多,我們應(yīng)該在等待I/O時(shí)做其它更有意義的工作。
轉(zhuǎn)載于:https://my.oschina.net/freax/blog/413785
總結(jié)
以上是生活随笔為你收集整理的理解Node.js的event loop的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Sizzle.selectors.mat
- 下一篇: Eclipse快捷键-方便查找