事件環

在計算機領域,事件環,或者被稱為訊息分發器,訊息環,訊息泵或者運行環這些定義不過是一個程式結構體,用以在程式中等待,分發事件或者訊息。它的工作方式是向內部或者外部的“事件提供方”發出請求(通常採取封鎖請求的方式,直到有事件發生),然後再呼叫相應的事件處理器(又稱“事件的分發“)。 事件環通常於編程設計模式” 反應器模式“相結合,前提是事件提供方遵循相同的檔案接口, 這樣事件提供方就可以被選擇, '被輪詢' (Unix系統這樣用被動方式稱呼,現在也可以直接叫 輪詢). 事件環幾乎總是對訊息發出方進行異步操作。

當一個事件流被用作程式的中心控制流程, 事實上它通常做這個用途, 這時它又可以被稱為”主環“或者”主事件環“。本文標題稱為事件環貼切一點,因為這樣的事件環一直是處在程式的最上的控制層面的。

基本介紹

  • 中文名:事件環
  • 外文名:Event ring
介紹,時間循環,javascript事件環,

介紹

JavaScript的主要用途主要是用戶互動,和操作DOM。如果JavaScript同時有兩個執行緒,一個執行緒在某個DOM節點上添加內容,另一個執行緒刪除了這個節點,這時這兩個節點會有很大衝突,為了避免這個衝突,所以決定了它只能是單執行緒,否則會帶來很複雜的同步問題。此外HTML5提出Web Worker標準,允許JavaScript腳本創建多個執行緒(UI執行緒, 異步HTTP請求執行緒, 定時觸發器執行緒...),但是子執行緒完全受主執行緒控制,這個新標準並沒有改變JavaScript單執行緒的本質。
任務佇列
單執行緒一個一個完成任務,前一個任務完成了,才會執行下一個任務,就是排隊一樣,不能插隊,只能前面的人完成才能輪到後一個。那么問題來了,加入一個人在那辦理很多任務,一時半會辦不完,難道就一直卡在那裡嗎,所有任務可以分成兩種,一種是同步任務(synchronous),另一種是異步任務(asynchronous)。
  1. 所有同步任務都在主執行緒上執行,形成一個執行棧
  2. 主執行緒之外,還存在一個任務佇列。只要異步任務有了運行結果,就在任務佇列之中放置一個事件。
  3. 一旦執行棧中的所有同步任務執行完畢,系統就會讀取任務佇列,看看裡面有哪些事件。那些對應的異步任務,於是結束等待狀態,進入執行棧,開始執行。
  4. 主執行緒不斷重複上面的第三步。

時間循環

主執行緒從任務佇列中讀取事件,這個過程是循環不斷的,所以整個的這種運行機制又稱為Event Loop(事件循環)
function readi
  console. log(1)
     setTimeout(function ((
        console. log(2)
     console. log(3);
reado
分析:setTimeout()的就表示當前代碼執行完(執行棧清空)以後,立即執行(0毫秒間隔)指定的回調函式。
除了廣義的同步任務和異步任務,我們對任務有更精細的定義:
Macrotask (宏任務):
  • setImmediate:把回調函式放在事件佇列的尾部
  • setTimeout:定時器
  • setInterval:定時器
Microtask 微任務):
  • process.nextTick:把回調函式放在當前執行棧的底部
  • Promise:

javascript事件環

事件循環的順序,決定js代碼的執行順序。進入整體代碼(宏任務)後,開始第一次循環。接著執行所有的微任務。然後再次從宏任務開始,找到其中一個任務佇列執行完畢,再執行所有的微任務。
JS是單執行緒的,也就是說任務需要一個接一個的按順序執行,這是因為JS作為瀏覽器端的腳本語言其開始主要用途還是與用戶互動和操作DOM,假如JS有兩個執行緒,一個添加DOM一個刪除DOM,這就勢必會出現不可預期的後果,所以說還是單執行緒更適合,但是這種方式有一個弊端,就是必須要等待前一個程式執行完畢才執行下一個,所以將程式分為了兩類:同步任務和異步任務。 在JS的執行棧中,同步任務進入主執行棧(也可以說主執行緒),而異步任務進入任務佇列(TaskQueue)等待執行,任務佇列可以理解成一個訊息佇列,I/O設備完成一件事,就向任務佇列添加一個事件,一旦主執行棧中所有的同步任務執行完畢,就會讀取任務佇列中等待的任務,並放入執行棧開始執行,其實就是執行異步任務的回調函式,所以說異步任務必須指定回調函式,主執行緒會不斷的循環這個動作,所以這種運行機制又稱為EventLoop(事件循環)。

相關詞條

熱門詞條

聯絡我們