JavaScript之事件迴圈案例講解
中的事件迴圈
因http://www.cppcns.com為是單執行緒的,同一事件只能執行一種方法,所以會將程式中的方法加入到執行棧中按照後進先出的順序依次執行,當遇見非同步任務時不會被阻塞,而是將任務放入事件佇列中,繼續執行執行棧中的同步程式碼,等當前執行棧中的所有任務都執行完畢則查詢事件佇列中的任務,並把任務的回撥函式放入執行棧中,執行其中的同步程式碼,如此反覆形成的迴圈被稱為事件迴圈。
node.js
node.js特點
事件驅動
從上向下執行程式碼,當遇到需要回調的地方就加入到事件佇列中,主執行緒執行完就去執行事件佇列中的回撥。整個過程不會阻塞新的事件,也不需要維護已經建立的事件
非阻塞io
主執行緒空閒時,就開始迴圈事件佇列,處理事件佇列中的事件,如果該事件不是io任務www.cppcns.com就親自處理,如果是io任務,則交給執行緒池處理並指定回撥函式,然後繼續迴圈佇列中的其他事件,當阻塞操作完成後會將結果和回撥函式放入佇列中,主執行緒迴圈到時就執行該回調函式。
node.js優缺點
優點
- 高併發:node.js用一個主執行緒處理所有的請求,然後對io操作進行非同步處理,避開了建立、銷燬執行緒以及線上程之間切換所需的開銷和複雜性
- 適合io密集型應用
缺點:
- 不適合CPU密集型應用:長時間的計算會導致cpu時間片不能釋放,使得後續io事件無法發起
- 不能充分利用多核cpu
- 可靠性低,一旦程式碼某個環節崩潰,整個系統都會崩潰
適用場景:
- restful api:請求和響應只需少量的文字,不需要大量的邏輯處理。可以處理數萬條連線,只需請求api組織資料並返回即可
- 大量Ajax請求的場景中
- 聊天服務:輕量級,高流量,沒有複雜的計算邏輯
node.js的事件迴圈
node事件迴圈依靠libuv引擎,v8解釋js程式碼後呼叫對應的node api,這些api由libuv引擎驅動執行對應任務,並把不同的事件放入不同的佇列中等待主執行緒執行,因此node的事件迴圈存在於libuv引擎中
libuv引擎:實現了事件迴圈、檔案操作等,是node.js實現非同步的核心
nodewww.cppcns.com.js的單執行緒僅僅指Script執行在單執行緒中,內部可以通過執行緒池完成io操作
poll(查詢階段)---》checkhttp://www.cppcns.com(檢查階段)---》close callback(關閉事件回撥階段)---》timer(定時器檢測階段)---》io回撥階段---》閒置階段---》輪詢階段
poll階段(輪詢階段):
v8將js程式碼解析後傳入libuv引擎中,迴圈首先進入poll階段。先檢視poll佇列是否有事件,有就按先進先出順序執行回撥
到此這篇關於JavaScript之事件迴圈案例講解的文章就介紹到這了,更多相關JavaScript之事件迴圈內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!