![](/img/trans.png)
[英]Why setImmediate() always run before setTimeout() in a I/O callback [NodeJS]?
[英]why this setImmediate is called before file read callback?
看一下這些代碼行
function someAsyncOperation () {
console.log("inside someAsyncOperation");
var startCallback = Date.now();
// do something that will take 10ms...
while (Date.now() - startCallback <= 100) {
; // do nothing
}
}
someAsyncOperation();
var timeoutScheduled = Date.now();
setImmediate(function () {
var delay = Date.now() - timeoutScheduled;
console.log(delay + "ms have passed since I was scheduled");
});
someAsyncOperation();
fs.readFile("./noor.txt",function(err,data){
var delay = Date.now() - timeoutScheduled;
console.log(delay + "file read");
});
據我所知, setImmediate回調是在任何I / O操作之后在事件循環結束時運行的。 但是在我的情況下,setImmediate回調在文件讀取操作返回之前被調用。 請解釋為什么會這樣,或者setImmediate回調執行背后的邏輯是什么。
當程序開始執行時,
setImmediate
將進入事件循環。 fs.readFile
也進入事件循環。 程序完成執行后,便進入事件循環。 它檢查哪些I / O回調未決。
fs.readFile
出現了。 但是它需要一個文件來讀取。 因此它在OS內核中保留了一個fd
(文件描述符),並說“讓我知道文件何時准備好讀取” [為了您的理解,它並沒有真正說過這一行],甚至不用等待1納米就返回第二。 setImmediate
將開始執行。 fs.readFile
之后,操作系統將以fd
返回。 fs.readFile
將立即完成。 因此, setImmediate
比fs.readFile
首先完成
。
您為什么期望fs.readFile()
在不到fs.readFile()
時間內完成? 特別是對於fs.readFile()
,發生了多種操作:打開文件,讀取一個或多個塊以及關閉文件。 這些操作花費相當長的時間(相對而言),並且在fs.readFile()
回調之前,很容易花費多個事件循環時間。
setImmediate()
函數是為了停止當前正在執行的函數的執行,並調用另一個函數來停止飢餓。 它主要是在I / O操作上調用的,以停止此功能以消耗CPU時間(在NodeJs異步調用中實現,因為它是單線程的)。 因此,它有助於無延遲地執行回調函數。
每當setImmediate()
,它都會返回到事件循環(也稱為uv_loop),以便執行其他等待執行的排隊函數。
您也可以通過以下鏈接: setImmediate函數
在您的代碼中
第1步,您正在調用
someAsyncOperation ()
,它正在同步工作,僅打印並在循環中等待100ms。步驟2,timeoutScheduled分配
Date.now()
步驟3再次調用
someAsyncOperation ()
再次執行相同的操作(someAsyncOperation ()
步驟1)第4步,它執行了一個I / O操作,即
fs.readFile
,在遇到這一行代碼后,它使用了setImmediate()
函數,現在delay = Date.now() - timeoutScheduled
(對於以下情況,延遲將保留大於100的值明顯的原因,因為它在someAsyncOperation ()
等待100ms在
setImmediate()
,由於沒有其他fd
准備好立即執行,它返回到回調函數。 現在,回調函數將打印適當的delay
值程序結束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.