事件佇列的理解

2022-03-30 22:59:46 字數 1719 閱讀 6650

在前端的日常工作中,我們可能不會特別關注事件佇列這樣比較抽象的概念,初次接觸事件佇列是在面試的時候被問到,你知道的----一臉懵逼,然後就各種網上搜尋,以下是我的理解,如果有不正確的地方希望大神們指正:

寫這篇部落格最主要的是參照了「逆光飛舞」的部落格:

第一、首先我們得了解前端工程、js       與     程序、執行緒的關係

ps:關於程序與執行緒的概念我也不是很清楚,我了解的是乙個程序可以包括多個執行緒。我們可以看一下阮一峰老師的解釋:               

現在的瀏覽器為了增強穩定性,使使用者乙個好的上網體驗,每開啟乙個網頁就作為獨立程序,當瀏覽器的某個網頁由於某種問題不得不退出的時候,不會影響你同時開啟的其他網頁,因為其他網頁在其他程序的空間裡,不在同一空間。否者,如果開啟的很多網頁都在同乙個程序裡,一旦某個網頁奔潰,那你所有的網頁都得關掉,這是很糟糕的體驗。 

前端工程師都知道js是單執行緒非同步的,而瀏覽器是多執行緒的(在當前網頁的程序內)。我們可以理解js執行緒是執行棧(js引擎執行緒),其他是輔助線程。

第二、瀏覽器的執行緒與js引擎執行緒

瀏覽器是多執行緒的:除了js引擎執行緒,還有ui渲染執行緒、瀏覽器事件觸發執行緒、http請求執行緒、eventloop輪詢的處理執行緒。。。。。。

單執行緒的含義是js只能在乙個執行緒上執行,也就是說,js同時只能執行乙個js任務,其它的任務則會等待執行;js是單執行緒的,但是js引擎有多個執行緒,其它的配合執行執行緒;多執行緒之間會共享執行資源,瀏覽器端的js會操作dom,多個執行緒必然會帶來同步問題,所以js核心選擇了單執行緒來避免處理這個麻煩,js可以操作dom,影響渲染,所以js引擎執行緒與ui執行緒是互斥的,這也就解釋了js執行時會阻塞頁面渲染。

第三、 js任務:同步任務與非同步任務

主線程執行的說明:【js的執行機制】

1)所有同步任務都在主線程上執行,形成乙個執行棧。 

(2)主線程之外,還存在乙個」任務佇列」。只要非同步任務有了執行結果,就在」任務佇列」之中放置乙個事件。 

(3)一旦」執行棧」中的所有同步任務執行完畢,系統就會讀取」任務佇列」,看看裡面有哪些事件。那些對應的非同步任務,於是結束等待狀態,進入執行棧,開始執行。 

(4)主線程不斷重複上面的第三步。

執行棧中的**(同步任務),總是在讀取」任務佇列」(非同步任務)之前執行。

第四、事件、定時器與**函式

第五、eventloop

主線程從」任務佇列」中讀取事件,這個過程是迴圈不斷的,所以整個的這種執行機制又稱為event loop(事件迴圈)。

簡單說,瀏覽器的兩個執行緒:乙個負責程式本身的執行,稱為」主線程」;另乙個負責主線程與其他程序(主要是各種i/o操作)的通訊,被稱為」event loop執行緒」(可以譯為」訊息執行緒」)。

由於js是執行在單執行緒上的,所有瀏覽器單獨開啟乙個執行緒來處理事件訊息的輪詢,避免阻塞js的執行。

非同步**的執行邏輯:

每當遇到i/o的時候,主線程就讓eventloop執行緒去通知相應的i/o程式,然後接著往後執行,所以不存在等待時間。等到i/o程式完成操作,eventloop執行緒把訊息新增到訊息佇列,主線程就呼叫事先設定的**函式,完成整個任務。

這也說明了在處理io時,瀏覽器通常會新開啟io執行緒,這個屬於我的推測,並沒有查到對應的資料,因為io涉及的廣泛,這話也沒錯。

js 事件迴圈,非同步,事件佇列

首先,現附上我查詢資料中用到較好的一張圖 這裡面就對事件迴圈,任務佇列,非同步操作介紹的很詳細.我的理解 較為粗略的一張圖 我認為的事件迴圈的主要邏輯 1.取乙個巨集任務來執行,執行完畢,下一步.2.取乙個微任務來執行,執行完畢,再取乙個微任務來執行,直到微任務全部取完.3.更新ui渲染 概念 巨集...

事件迴圈中事件佇列的順序

同步任務 nexttick 函式佇列 微任務 promise 函式佇列 微任務 timeout,interval定時器任務佇列 巨集任務 i o事件任務佇列,如http請求 檔案讀寫等 巨集任務 immediate任務佇列 注 對於當前正在執行任務所產生的的子任務,不管是什麼型別的,都得等當前任務佇...

繫結事件 事件佇列 事件迴圈

一 繫結事件 1.html元素內繫結 2.js繫結事件 3.事件監聽繫結 1 點我一哈 2 我是js事件 3 我是監聽事件 4 二 定時器 1.settimeout延時器,延時執行,只執行一次 語法 settimeout callback,delay 2.清除延時器 cleartimeout 定時器...