您好,登錄后才能下訂單哦!
這篇文章主要介紹JavaScript之事件循環的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
因為JavaScript是單線程的,同一事件只能執行一種方法,所以會將程序中的方法加入到執行棧中按照后進先出的順序依次執行,當遇見異步任務時不會被阻塞,而是將任務放入事件隊列中,繼續執行執行棧中的同步代碼,等當前執行棧中的所有任務都執行完畢則查找事件隊列中的任務,并把任務的回調函數放入執行棧中,執行其中的同步代碼,如此反復形成的循環被稱為事件循環。
從上向下執行代碼,當遇到需要回調的地方就加入到事件隊列中,主線程運行完就去執行事件隊列中的回調。整個過程不會阻塞新的事件,也不需要維護已經建立的事件
主線程空閑時,就開始循環事件隊列,處理事件隊列中的事件,如果該事件不是io任務就親自處理,如果是io任務,則交給線程池處理并指定回調函數,然后繼續循環隊列中的其他事件,當阻塞操作完成后會將結果和回調函數放入隊列中,主線程循環到時就執行該回調函數。
高并發:node.js用一個主線程處理所有的請求,然后對io操作進行異步處理,避開了創建、銷毀線程以及在線程之間切換所需的開銷和復雜性
適合io密集型應用
不適合CPU密集型應用:長時間的計算會導致cpu時間片不能釋放,使得后續io事件無法發起
不能充分利用多核cpu
可靠性低,一旦代碼某個環節崩潰,整個系統都會崩潰
restful api:請求和響應只需少量的文本,不需要大量的邏輯處理。可以處理數萬條連接,只需請求api組織數據并返回即可
大量Ajax請求的場景中
聊天服務:輕量級,高流量,沒有復雜的計算邏輯
node事件循環依靠libuv引擎,v8解釋js代碼后調用對應的node api,這些api由libuv引擎驅動執行對應任務,并把不同的事件放入不同的隊列中等待主線程執行,因此node的事件循環存在于libuv引擎中
libuv引擎:實現了事件循環、文件操作等,是node.js實現異步的核心
node.js的單線程僅僅指JavaScript運行在單線程中,內部可以通過線程池完成io操作
poll(查詢階段)---》check(檢查階段)---》close callback(關閉事件回調階段)---》timer(定時器檢測階段)---》io回調階段---》閑置階段---》輪詢階段
poll階段(輪詢階段):
v8將js代碼解析后傳入libuv引擎中,循環首先進入poll階段。先查看poll隊列是否有事件,有就按先進先出順序執行回調
以上是“JavaScript之事件循環的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。