深入淺出node.js異步編程 及async await原理


最近看了一些文章對於async await的原理及概念的解析,我覺得很多時候有些不太准確。

尤其是對於async和await會阻塞線程的說法更是有些扯淡了,JS本身就是單線程的語言如果await會阻塞線程那不是說JS自己搬石頭砸自己的腳?

用最簡單的話去描述

在node中執行一個文件,或處理一個HTTP請求,這個時候js會將同步任務與異步任務區分,如果是同步任務將會被推入執行棧交由主線程執行。

如果是異步任務將被扔到事件表當中,當異步任務執行完畢將會被推入事件隊列當中,等主線程將同步任務執行完畢后。

將會執行事件隊列中的異步任務,其中又分為宏任務與微任務。

當事件隊列中沒有執行完畢的異步任務,主線程將會處理下一個http請求,再次進入這樣的循環,處理同步任務,查看事件隊列中是否有執行完畢的異步任務。

如果在執行時遇到async await

那么會將awiat后的代碼丟入事件表,並對當前函數進行壓棧

也就是跳過當前函數執行下面主線程中的代碼 當主線程同步任務執行完畢后,會按照node原本的機制執行事件隊列中的異步任務

這個時候如果awiat后的表達式或異步任務已經執行完畢,那么會將其所在的函數進行出棧,執行。

那么問題來了,這其中有所謂的阻塞I/O嗎?沒有,那么為什么要說這些誤導大家呢?要知道node是非阻塞I/O模型,如果I/O阻塞那node還要不要玩了?

下面這張圖是event loop循環的過程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM