日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

理解Node.js的event loop

發(fā)布時(shí)間:2025/3/8 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。