會有乙個呼叫執行棧,只要棧為空的時候才會執行巨集任務微任務。並且執行任何乙個巨集任務之前,會檢視微任務佇列是否有任務需要執行,也就是說巨集任務的函式裡如果有微任務的入列,執行下乙個巨集任務之前會除了執行完當前巨集任務的主線程**後再執行優先把剛剛加入微任務佇列的微任務
常見的巨集任務:ajax,dom監聽
常見的微任務:mutation observer api(提供了監視對dom樹所做更改的能力), queuemicrotask()(自定義微任務)
libuv是乙個多平台的專注於非同步io的庫
**我們例如fs
一般情況下我們會採用非阻塞式的呼叫,這樣的呼叫方式會直接返回結果,但是我們怎麼知道我們的檔案操作有沒有結束或者檔案是否讀取完呢?這就需要我們頻繁的去確定讀取到的資料是否完整(或檔案操作是否完成)。這個過程我們稱為輪訓操作
node中的巨集任務:settimeout,io事件,close事件因為微任務和巨集任務也會細化分好幾個佇列。他們的執行順序如下:node中的微任務:process.nexttick,queuemicrotask
練習一下:
settimeout((
)=> console.
log(
'set1'),
0)settimeout((
)=> console.
log(
'set2'),
300)
setimmediate((
)=> console.
log(
'imte'
))
執行順序為
set1
imte
set2
這是因為set2有乙個延遲,它會先放到紅黑樹中儲存並延遲加入到timer的巨集任務佇列,因為set1的延遲為0,相當於直接加進去佇列,所以先執行set1,遇到imte因為是立即執行列印imte,set2等300ms後加入佇列最後再列印set2
程序(process): 當我們啟動乙個應用程式,會預設啟動乙個程序(也可能是多個程序)也就是計算機已經執行的程式執行緒(thread):每個程序都會啟動執行緒來執行程式中的**,這個執行緒稱為主線程。也就是說程序包含執行緒,程序是執行緒的容器,乙個程序至少有乙個執行緒,也可以有多個執行緒
因為執行緒是作業系統能夠執行運算排程的最小單位。所以cpu可以直接執行執行緒
因為cpu運算速度非常的快,它頻繁的運算排程每個程序的執行緒,在多個程序之間迅速的切換。當我們程序中的執行緒獲取到時間片時,就可以快速執行我們編寫的**。但是我們基本是感受不到這種快速的切換的js是單執行緒的,為什麼單執行緒,經典例子是操作乙個dom但同時刪除乙個dom。而執行緒必須依賴程序,所以js的容器一般是瀏覽器或者node。
Node 非同步I O機制
提到js,可能就免不了單執行緒,事件機制,非阻塞i o,非同步i o等等,這些詞語。不能說理解的有多麼深刻,想談談自己的一些看法。node底層採用chrome v8 j ascript搜尋引擎,其解析的速度快,效能穩定,提供了乙個良好的解析環境。這一節從非同步i o機制來看看node自身的特點。以下...
js 和 node 裡面的事件迴圈
前言 之前有接觸過 js 事件迴圈,感覺比較容易理解。後面學習 深入淺出node.js 的時候,發現裡面提到的事件迴圈有點繞比較難理解,後面查了一些資料和部落格後,發現 node 環境下的事件迴圈和我之前接觸的事件迴圈是有一定的區別的。廢話不多說,先上圖 js 的事件迴圈,把非同步任務分為兩種 巨集...
node 非阻塞式I O,單執行緒,非同步,事件驅動
1 單執行緒 不同於其他的後盾語言,node是單執行緒的,大大節約伺服器開支 node不為每個客戶建立乙個新的執行緒,僅使用乙個執行緒。通過非阻塞i o以及 事件驅動機制,使其巨集觀上看是併發的,可以處理高併發。2 非阻塞式i o 1 當我們遭遇非同步時,可以通過以下方法解決 函式 在使用非同步的函...