JS單線程之eventloop

EventLoop是什麼?

前言: eventloop即事件循環,是指瀏覽器或Node的一種解決JAVASCRIPT單線程運行時不會堵塞的一種機制,也就是我們經常使用異步的原理。

簡短:異步解決方案。

瀏覽器的實現:根據html5規範明確定義。

node的實現:libuv實現(恐龍頭像)–thread pool (關鍵)

google和node都是用v8引擎,但是處理不一樣。

EventLoop是一個執行模式,在不同的地方有不同的實現,瀏覽器和node.js基於不同的技術實現了各自的EventLoop。


宏任務,macrotask,也叫tasks。一些異步任務的回調會依次進入macro task queue,等待後續被調用,這些異步任務包括:
setTimeout
setInterval
setImmediate(Node獨有)
requestAnimationFrame(瀏覽器獨有)
I/O
UI rendering(瀏覽器獨有)

微任務,microtask,也叫jobs.另一些異步任務的回調會依次進入micro task queue,等待後續被調用,這些異步任務包括:
process.nextTick(Node獨有)
Promise.then()
Object.observe
MutationObserve
(注:這裏只針對瀏覽器和NodeJS)

node的執行 6個階段 6個異步任務隊列循環 分宏任務和微任務 nextTick then

timer(計時器)
執行setTimeout以及
setInterval的回調

I/O callbacks
處理網絡、流、tcp的錯誤(http.get)
callback

idle prepares
node內部使用

poll(輪詢) <---- incoming:
執行poll中的i/o隊列 connections,
檢查定時器是否到時 data, etc.

check
處理setImmediate的回調

close callbacks
關閉的回調例如
socket.on(‘close’)

1、先執行全局Script同步代碼
2、執行微任務,先執行next tick queue中所有的任務,再執行othter microtask queue中的所有任務
3、開始執行宏任務,共6個階段,等六個階段都執行完在回到步驟2。

瀏覽器的執行
一個函數執行棧、一個事件隊列(一次拿一個 等所有微任務執行完 再去拿宏任務)和一個微任務隊列(連着連着調 一次取所有)
undefined(一輪事件循環的執行完畢 後面的異步任務都是在第二輪的事件循環執行的)
執行棧(foo() query() hello())-> Web Api(異步任務) -> 任務隊列(放的是宏任務–onclick、 onload,表示執行所有微任務,再取執行宏任務) -> 事件循環

在瀏覽器裏面:
每從事件隊列中取一個事件時,有微任務的話,一定先把所有的微任務執行完,然後纔開始從任務隊列中執行事件。
執行所有微任務->一個宏任務->執行所有微任務->一個宏任務->。。。。

在瀏覽器端,所有的宏任務都在同一個任務隊列執行

在node端,宏任務分爲六個任務隊列
執行所有微任務->所有的宏任務(6個階段)->所有的微任務->所有的宏任務(6個階段)。。。

js的主線程是單線程。。。

setTimeout有一個取值範圍

注: 以上的node環境是node10以下版本,node11版本開始,與瀏覽器的機制差不多。。。。。無語。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章