前端瀏覽器Event loop是個什麼鬼!

進程 與 線程

進程是操做系統分配資源和調度任務的基本單位
線程是創建在進程上的一次程序運行單位
一個進程上能夠有多個線程
複製代碼

多進程的瀏覽器

1) 用戶界面-包括地址欄、前進/後退按鈕、書籤菜單等
2) 瀏覽器引擎-在用戶界面和呈現引擎之間傳送指令(瀏覽器的主進程)
3) 渲染引擎,也被稱爲瀏覽器內核(瀏覽器渲染進程)
4) 一個插件對應一個進程(第三方插件進程)
5) GPU提升網頁瀏覽的體驗(GPU進程)
複製代碼

渲染引擎

渲染引擎內部是多線程的,包含: ui線程 js線程 且二者是互斥的
    由於JS運行結果會影響到ui線程的結果;
    ui更新會被保存在隊列中等到js線程空閒時當即被執行。
複製代碼

js單線程(主線程)

javascript在最初設計時設計成了單線程,爲何不是多線程呢?
    若是多個線程同時操做DOM那豈不會很混亂?
    這裏所謂的單線程指的是主線程是單線程的,因此在Node中主線程依舊是單線程的。
複製代碼

其餘線程

1) 瀏覽器事件觸發線程(用來控制事件循環,存放setTimeout、瀏覽器事件、ajax的回調函數)
2) 定時觸發器線程(setTimeout定時器所在線程)
3) 異步HTTP請求線程(ajax請求線程)
複製代碼

瀏覽器中的Event Loop (事件循環)

1) 1.全部同步任務都在主線程上執行,造成一個執行棧
2) 主線程以外,還存在一個任務隊列。只要異步任務有了運行結果,就在任務隊列之中放置一個事件。
3) 一旦執行棧中的全部同步任務執行完畢,系統就會讀取任務隊列,將隊列中的事件放到執行棧中依次執行
4) 主線程從任務隊列中讀取事件,這個過程是循環不斷的
複製代碼

Node系統

1) 咱們寫的js代碼會交給v8引擎進行處理
2) 代碼中可能會調用nodeApi,node會交給libuv庫處理
3) libuv經過阻塞i/o和多線程實現了異步io
4) 經過事件驅動的方式,將結果放到事件隊列中,最終交給咱們的應用。
複製代碼

同步與異步

同步和異步關注的是消息通知機制javascript

1) 同步就是發出調用後,沒有獲得結果以前,該調用不返回,一旦調用返回,就獲得返回值了。 簡而言之就是調用者主動等待這個調用的結果
2) 而異步則相反,調用者在發出調用後這個調用就直接返回了,因此沒有返回結果。換句話說當一個異步過程調用發出後,調用者不會馬上獲得結果,而是調用發出後,被調用者經過狀態、通知或回調函數處理這個調用。
複製代碼

阻塞與非阻塞

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.java

1) 阻塞調用是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。
2) 非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程。
複製代碼

組合

同步異步取決於被調用者,阻塞非阻塞取決於調用者node

1) 同步阻塞
2) 異步阻塞
3) 同步非阻塞
4) 異步非阻塞
複製代碼

宏任務和微任務

任務可分爲宏任務和微任務ajax

1) macro-task(宏任務): setTimeout, setInterval, setImmediate, I/O MessageChannel
2) micro-task(微任務): process.nextTick, 
    原生Promise(有些實現的promise將then方法放到了宏任務中);
    Object.observe(已廢棄), MutationObserver
複製代碼

什麼場合下應該考慮使用Node框架

當應用程序須要處理大量併發的I/O操做,而在向客戶端響應以前,應用程序並不須要進行很是複雜的處理。promise

1) 聊天服務器
2) 電子商務網站
複製代碼
相關文章
相關標籤/搜索