簡體   English   中英

“調用堆棧”和“事件循環”如何交互或協同工作?

[英]How "call stack" and "event loop" interact or work together?

我對 Node.js 的架構有點困惑

據我所知,在瀏覽器運行時環境中,事件循環會不斷檢查調用堆棧是否為空,如果為空,則將回調隊列或微任務隊列中的回調推送到調用堆棧中。

Nodejs 架構的圖片

但是在 nodejs 中,事件循環檢查它是否阻塞操作。

我的問題是,假設我有一個 function,其中前 10 行是第 11 行的同步代碼,有一些異步或阻塞 function。 然后據我所知(如果我錯了,請糾正我),function 應該首先 go 進入調用堆棧並運行前 10 行,當調用堆棧到達第 11 行時,它將 Z34D1F91FB2E514B85BZFA 進入另一個隊列A514B85BZA。

但是當我附上一個圖片鏈接時,不清楚,調用堆棧和事件循環之間的代碼執行流程是什么。

據我所知,在瀏覽器運行時環境中,事件循環會不斷檢查調用堆棧是否為空,如果為空,則將回調隊列或微任務隊列中的回調推送到調用堆棧中。

首先,沒有持續檢查調用堆棧。 事件循環本身位於調用堆棧的根部。 因此,當用戶代碼完成執行並返回時,從正在執行的 Javascript 的最后一位返回的返回將返回到事件循環,在那里它可以檢查各種隊列並確定接下來要處理的事件。

我的問題是,假設我有一個 function,其中前 10 行是第 11 行的同步代碼,有一些異步或阻塞 function。 然后據我所知(如果我錯了,請糾正我),function 應該首先 go 進入調用堆棧並運行前 10 行,當調用堆棧到達第 11 行時,它將 Z34D1F91FB2E514B85BZFA 進入另一個隊列A514B85BZA。

異步 function 不會阻塞。 它開始一些操作,然后代碼繼續執行。 因此,作為示例,如果您在 nodejs 中調用fs.readFile()fs.promises.readFile() ,則那些 function 調用會啟動操作,然后立即返回並執行之后的代碼行。 由於此代碼在您對.readFile()的調用完成執行后,它最終會將控制權返回到事件循環,在未來的某個時間, .readFile() function 將完成並在事件隊列中插入一個事件然后可以處理事件循環。

callstack 和 eventloop 之間的代碼執行流程是什么?

調用堆棧控制 Javascript 執行的給定塊。 當進行 function 調用時,當 function 返回時應繼續執行的位置被推入調用堆棧。 它只是一種處理 function 調用的機制。 Unlike other languages, variables scoped within a function are not put on the stack because those type of scope variables in Javascript can have a different lifetime than the execution of the function. 相反,它們被垃圾收集。 因此,Javascript 中的調用堆棧只是從 function 調用返回位置。

因為 nodejs 將 Javascript 作為單線程運行,所以事件循環不會執行任何等待事件,直到給定的 Javascript 塊完成執行,然后調用堆棧為空並且控制返回到事件循環,然后它可以開始一個Javascript 的新塊正在執行以處理下一個事件。

因此,調用堆棧有助於運行一大塊 Javascript。 只有當調用棧為空並且控制返回到事件循環時,下一個等待處理的事件才能運行。 兩者做的事情非常不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM