簡體   English   中英

為什么在讀取文件回調之前調用此setImmediate?

[英]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回調執行背后的邏輯是什么。

當程序開始執行時,

  1. setImmediate將進入事件循環。
  2. 接下來, fs.readFile也進入事件循環。

程序完成執行后,便進入事件循環。 它檢查哪些I / O回調未決。

  1. 現在, fs.readFile出現了。 但是它需要一個文件來讀取。 因此它在OS內核中保留了一個fd (文件描述符),並說“讓我知道文件何時准備好讀取” [為了您的理解,它並沒有真正說過這一行],甚至不用等待1納米就返回第二。
  2. 現在,下一個setImmediate將開始執行。
  3. 在事件循環中將文件打開到fs.readFile之后,操作系統將以fd返回。 fs.readFile將立即完成。

因此, setImmediatefs.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM