最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分析node事件循環(huán)和消息隊列

 更新時間:2021年06月04日 14:26:08   作者:俗的太不一樣  
node的好處毋庸置疑,事件驅(qū)動,異步非阻塞I/O,以及處理高并發(fā)的能力深入人心,因此大家喜歡用node做一些小型后臺服務(wù)或者作為中間層和其他服務(wù)配合完成一些大型應(yīng)用場景。

什么是異步?

異步和同步應(yīng)該是經(jīng)常談的一個話題了。同步的概念很簡單,自上而下依次執(zhí)行,必須等上邊執(zhí)行完下邊才會執(zhí)行。而異步可以先提交一個命令,中間可以去執(zhí)行別的事務(wù),而當(dāng)執(zhí)行完之后回過頭來返回之前的任務(wù)。

舉個例子:

你很幸運(yùn),找了一個漂亮的女朋友,有一天你的女朋友發(fā)短信問你晚上看什么電影?但你并不知道看什么,馬上打開電腦查了一下近期熱播的電影,這其中你女朋友一直在等你,這就是同步

而異步呢?還是你女朋友發(fā)短信問你看什么電影,你跟她說: 你先等會吧吧,等我查一下,查好之后你回頭打電話告訴了她。這就是異步。

從而我們能看出同步和異步的一些特點(diǎn):

1.必須發(fā)生在兩個對象身上。(你和你女朋友)

2.必須發(fā)生一些事情。(看電影)

不同的就是:同步就是依次執(zhí)行,執(zhí)行完一個之后在執(zhí)行另一個,直到執(zhí)行完成,而異步就是先執(zhí)行一個,可能沒有執(zhí)行完成再去執(zhí)行另一個,等第一個執(zhí)行完成后再返回結(jié)果

為什么需要異步呢?

答案很明顯,為了提高辦事的效率,CPU計算速度和磁盤的讀寫速度差太遠(yuǎn)了,磁盤供不應(yīng)求,因此有了計算機(jī)的存儲系統(tǒng)的分層設(shè)計,平衡了效率和成本??梢哉f懶惰推動人類的進(jìn)步,任何可以降低花費(fèi)時間而達(dá)到同等功效的方法肯定會被優(yōu)先采用。

發(fā)送短信時等待對方回復(fù)的時間純粹的浪費(fèi)掉了,CPU寫入磁盤等待返回的結(jié)果的等待時間也被無情的消耗了,這是一個講究效率的時代完全不能忍受的,因此讓員工一直處于忙碌狀態(tài),最大限度的榨取員工價值是老板追求的,讓CPU和磁盤都不停的滿負(fù)荷處理事務(wù)也是效率需要的。因此,異步處理出現(xiàn)了。

什么是異步IO?

異步IO是指操作系統(tǒng)提供的IO(數(shù)據(jù)進(jìn)出)的能力,比如鍵盤輸入,對應(yīng)到顯示器上會有專門的數(shù)據(jù)輸出接口,這就是我們生活中可見的IO能力;這個接口在向下會進(jìn)入到操作系統(tǒng)這個層面,在操作系統(tǒng)中,會提供諸多的能力,比如:磁盤的讀寫,DNS的查詢,數(shù)據(jù)庫的連接啊,網(wǎng)絡(luò)請求的處理,等等;

在不同的操作系統(tǒng)層面,表現(xiàn)的不一致。有的是異步非阻塞的;有的是同步的阻塞的,無論如何,我們都可以看做是上層應(yīng)用于下層系統(tǒng)之間的數(shù)據(jù)交互;上層依賴于下層,但是反過來,上層也可以對下層提供的這些能力進(jìn)行改造;如果這種操作是異步的,非阻塞的,那么這種就是異步非阻塞的異步IO模型;如果是同步的阻塞的,那么就是同步IO模型;

koa就是一個上層的web服務(wù)框架,全部由js實現(xiàn),他有操作系統(tǒng)之間的交互,全部通過nodejs來實現(xiàn);如nodejs的 readFile就是一個異步非阻塞的接口,readFileSync就是一個同步阻塞接口。

什么是事件循環(huán)?

事件循環(huán)是指Node.js執(zhí)行非阻塞I/O操作,盡管JavaScript是單線程的,但由于大多數(shù)內(nèi)核都是多線程的,node.js會盡可能將操作裝載到系統(tǒng)內(nèi)核。因此它們可以處理在后臺執(zhí)行的多個操作。當(dāng)其中一個操作完成時,內(nèi)核會告訴Node.js,以便node.js可以將相應(yīng)的回調(diào)添加到輪詢隊列中以最終執(zhí)行。也就是說,js是單線程的,但是node運(yùn)行的時候其實是多線程的。(個人理解)而消息隊列是一個先進(jìn)先出的隊列,它里面存放著各種消息。

V8引擎

我們常說的Chrome引擎和nodejs引擎就是V8引擎,他大致由以下組成:

這個引擎由內(nèi)存堆和調(diào)用棧組成,內(nèi)存堆就是負(fù)責(zé)進(jìn)行內(nèi)存分配,比如變量賦值,調(diào)用棧就是代碼執(zhí)行的地方。

調(diào)用棧中順序執(zhí)行主線程的代碼,當(dāng)調(diào)用棧中為空時,js引擎會去消息隊列取消息。取到后就執(zhí)行。JavaScript是單線程的編程語言,意味著它有一個單一的調(diào)用棧。因此它只能在同一時間做一件事情。調(diào)用棧是一種數(shù)據(jù)結(jié)構(gòu),它基本上記錄了我們在程序中的什么位置。如果我們步入一個函數(shù)中,我們會把這些數(shù)據(jù)放在堆棧的頂部。如果我們從一個函數(shù)中返回,這些數(shù)據(jù)將會從棧頂彈出。這就是堆棧的用途。調(diào)用棧中的每個條目叫做棧幀。堆和棧的區(qū)別就是先進(jìn)先出,一個先進(jìn)后出。

當(dāng)js運(yùn)行時

我們經(jīng)常使用的一些API并不是js引擎中提供的,例如定時器setTimeout。

它們其實是在瀏覽器中提供的,也就是運(yùn)行時提供的,因此,實際上除了JavaScript引擎以外,還有其他的組件。

其中有個組件就是由瀏覽器提供的,叫Web APIs,像DOM,AJAX,setTimeout等等。

然后還有就是非常受歡迎的事件循環(huán)和回調(diào)隊列。

運(yùn)行時負(fù)責(zé)給引擎線程發(fā)送消息,只負(fù)責(zé)生產(chǎn)消息,不負(fù)責(zé)取消息。

消息隊列

主線程在執(zhí)行過程中遇到了異步任務(wù),就發(fā)起函數(shù)或者稱為注冊函數(shù),通過event loop線程通知相應(yīng)的工作線程(如ajax,dom,setTimout等),同時主線程繼續(xù)向后執(zhí)行,不會等待。等到工作線程完成了任務(wù),eventloop線程會將消息添加到消息隊列中,如果此時主線程上調(diào)用棧為空就執(zhí)行消息隊列中排在最前面的消息,依次執(zhí)行。

新的消息進(jìn)入隊列的時候,會自動排在隊列的尾端。

單線程意味著js任務(wù)需要排隊,如果前一個任務(wù)出現(xiàn)大量的耗時操作,后面的任務(wù)得不到執(zhí)行,任務(wù)的積累會導(dǎo)致頁面的“假死”。這也是js編程一直在強(qiáng)調(diào)需要回避的“坑”。

主線程會循環(huán)上述步驟,事件循環(huán)就是主線程重復(fù)從消息隊列中取消息、執(zhí)行的過程。

需要注意的是 GUI渲染線程與JS引擎是互斥的,當(dāng)JS引擎執(zhí)行時GUI線程會被掛起,GUI更新會被保存在一個隊列中等到JS引擎空閑時立即被執(zhí)行。因此頁面渲染都是在js引擎主線程調(diào)用棧為空時進(jìn)行的。

其實 事件循環(huán) 機(jī)制和 消息隊列 的維護(hù)是由事件觸發(fā)線程控制的。

事件觸發(fā)線程 同樣是瀏覽器渲染引擎提供的,它會維護(hù)一個 消息隊列。

JS引擎線程遇到異步(DOM事件監(jiān)聽、網(wǎng)絡(luò)請求、setTimeout計時器等...),會交給相應(yīng)的線程單獨(dú)去維護(hù)異步任務(wù),等待某個時機(jī)(計時器結(jié)束、網(wǎng)絡(luò)請求成功、用戶點(diǎn)擊DOM),然后由 事件觸發(fā)線程 將異步對應(yīng)的 回調(diào)函數(shù) 加入到消息隊列中,消息隊列中的回調(diào)函數(shù)等待被執(zhí)行。

同時,JS引擎線程會維護(hù)一個 執(zhí)行棧,同步代碼會依次加入執(zhí)行棧然后執(zhí)行,結(jié)束會退出執(zhí)行棧。

如果執(zhí)行棧里的任務(wù)執(zhí)行完成,即執(zhí)行棧為空的時候(即JS引擎線程空閑),事件觸發(fā)線程才會從消息隊列取出一個任務(wù)(即異步的回調(diào)函數(shù))放入執(zhí)行棧中執(zhí)行。

以上就是分析node事件循環(huán)和消息隊列的詳細(xì)內(nèi)容,更多關(guān)于node事件循環(huán)和消息隊列的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Node koa服務(wù)器實現(xiàn)獲取客戶端ip

    Node koa服務(wù)器實現(xiàn)獲取客戶端ip

    這篇文章主要為大家詳細(xì)介紹了Node koa服務(wù)器實現(xiàn)獲取客戶端ip的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下
    2025-02-02
  • Node.js+express+socket實現(xiàn)在線實時多人聊天室

    Node.js+express+socket實現(xiàn)在線實時多人聊天室

    這篇文章主要為大家詳細(xì)介紹了Node.js+express+socket實現(xiàn)在線實時多人聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Node.js創(chuàng)建一個簡單的服務(wù)器的實現(xiàn)

    Node.js創(chuàng)建一個簡單的服務(wù)器的實現(xiàn)

    Node.js是一個基于Chrome V8引擎的JavaScript運(yùn)行時環(huán)境,可以在服務(wù)器端運(yùn)行JavaScript代碼,本文主要介紹了Node.js創(chuàng)建一個簡單的服務(wù)器的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • mac下的nodejs環(huán)境安裝的步驟

    mac下的nodejs環(huán)境安裝的步驟

    本篇文章主要介紹了mac下的nodejs環(huán)境安裝的步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • nodejs高版本降為低版本的詳細(xì)解決方案

    nodejs高版本降為低版本的詳細(xì)解決方案

    部分老舊項目需要使用低版本的node,網(wǎng)上很多是無效的,高版本無法直接安裝低版本node,但是低版本nodejs可以安裝部分高版本node,從而達(dá)到升級效果,下面這篇文章主要給大家介紹了關(guān)于nodejs高版本降為低版本的詳細(xì)解決方案,需要的朋友可以參考下
    2022-12-12
  • 充分發(fā)揮Node.js程序性能的一些方法介紹

    充分發(fā)揮Node.js程序性能的一些方法介紹

    這篇文章主要介紹了充分發(fā)揮Node.js程序性能的一些方法介紹,Node.js是把JavaScript用于服務(wù)器端的框架,需要的朋友可以參考下
    2015-06-06
  • Node.js 日志處理模塊log4js

    Node.js 日志處理模塊log4js

    今天和大家分享一下NodeJS中寫日志的一個常用第三方包:Log4js.下面我們就來詳細(xì)探討下吧
    2016-08-08
  • 手寫Node靜態(tài)資源服務(wù)器的實現(xiàn)方法

    手寫Node靜態(tài)資源服務(wù)器的實現(xiàn)方法

    這篇文章主要介紹了手寫Node靜態(tài)資源服務(wù)器的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Node.js調(diào)試技術(shù)總結(jié)分享

    Node.js調(diào)試技術(shù)總結(jié)分享

    Node.js是一個可以快速構(gòu)建網(wǎng)絡(luò)服務(wù)及應(yīng)用的平臺。該平臺的構(gòu)建是基于Chrome's JavaScript runtime,也就是說,實際上它是對Google V8引擎(應(yīng)用于Google Chrome瀏覽器)進(jìn)行了封裝。 今天介紹Node.js調(diào)式目前有幾種技術(shù),需要的朋友可以參考下。
    2017-03-03
  • nodejs+mongodb aggregate級聯(lián)查詢操作示例

    nodejs+mongodb aggregate級聯(lián)查詢操作示例

    這篇文章主要介紹了nodejs+mongodb aggregate級聯(lián)查詢操作,結(jié)合實例形式分析了基于nodejs的mongodb數(shù)據(jù)庫級聯(lián)查詢相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03

最新評論

西乡县| 罗源县| 昌都县| 游戏| 竹山县| 克拉玛依市| 武山县| 苏州市| 平顶山市| 台南市| 隆尧县| 陇南市| 合作市| 周口市| 平远县| 苍溪县| 临湘市| 南川市| 金堂县| 陵川县| 通山县| 沂源县| 鄂托克前旗| 五河县| 高阳县| 开封县| 台中县| 土默特左旗| 嵊州市| 天祝| 临沧市| 岚皋县| 华安县| 赤壁市| 望都县| 太湖县| 汶川县| 延安市| 杨浦区| 梧州市| 无棣县|