91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用node怎么實現事件循環和消息隊列

發布時間:2021-06-05 17:57:47 來源:億速云 閱讀:477 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關使用node怎么實現事件循環和消息隊列,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

什么是異步?

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

舉個例子:

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

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

從而我們能看出同步和異步的一些特點:

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

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

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

為什么需要異步呢?

答案很明顯,為了提高辦事的效率,CPU計算速度和磁盤的讀寫速度差太遠了,磁盤供不應求,因此有了計算機的存儲系統的分層設計,平衡了效率和成本。可以說懶惰推動人類的進步,任何可以降低花費時間而達到同等功效的方法肯定會被優先采用。

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

什么是異步IO?

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

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

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

什么是事件循環?

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

V8引擎

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

使用node怎么實現事件循環和消息隊列

這個引擎由內存堆和調用棧組成,內存堆就是負責進行內存分配,比如變量賦值,調用棧就是代碼執行的地方。

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

當js運行時

使用node怎么實現事件循環和消息隊列

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

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

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

然后還有就是非常受歡迎的事件循環和回調隊列。

運行時負責給引擎線程發送消息,只負責生產消息,不負責取消息。

消息隊列

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

新的消息進入隊列的時候,會自動排在隊列的尾端。

單線程意味著js任務需要排隊,如果前一個任務出現大量的耗時操作,后面的任務得不到執行,任務的積累會導致頁面的“假死”。這也是js編程一直在強調需要回避的“坑”。

主線程會循環上述步驟,事件循環就是主線程重復從消息隊列中取消息、執行的過程。

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

其實 事件循環 機制和 消息隊列 的維護是由事件觸發線程控制的。

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

JS引擎線程遇到異步(DOM事件監聽、網絡請求、setTimeout計時器等...),會交給相應的線程單獨去維護異步任務,等待某個時機(計時器結束、網絡請求成功、用戶點擊DOM),然后由 事件觸發線程 將異步對應的 回調函數 加入到消息隊列中,消息隊列中的回調函數等待被執行。

同時,JS引擎線程會維護一個 執行棧,同步代碼會依次加入執行棧然后執行,結束會退出執行棧。

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

關于使用node怎么實現事件循環和消息隊列就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

茌平县| 定远县| 昭通市| 旬阳县| 广安市| 甘肃省| 望城县| 阿拉善左旗| 天峨县| 商都县| 辰溪县| 保德县| 镇江市| 镇安县| 花莲市| 锡林郭勒盟| 萨迦县| 和硕县| 东乌| 黄陵县| 剑川县| 永仁县| 峨眉山市| 玛纳斯县| 志丹县| 怀化市| 安庆市| 淮北市| 瓦房店市| 富蕴县| 许昌县| 友谊县| 靖州| 石门县| 长治市| 泸定县| 潍坊市| 临洮县| 乐亭县| 五指山市| 开原市|