Why is setImmediate () executed before fs.readFile () in Nodejs Event Loop works?

I read a lot of related documents. But I still can’t understand how it works.

const fs = require('fs')
const now = Date.now();

setTimeout(() => console.log('timer'), 10);
fs.readFile(__filename, () => console.log('readfile'));
setImmediate(() => console.log('immediate'));
while(Date.now() - now < 1000) {
}

const now = Date.now();

setImmediate(() => console.log('immediate'));
setTimeout(() => console.log('timer'), 10);
while(Date.now() - now < 1000) {
}

I think the first part of the code should be logged:

readfile
immediate

And the second part of the code logs.

timer
immediate

I think that everything is in order.

Problem: I do not understand why the first part of the code logs

immediate
readfile

I think the file has been completely read and its callback function enqueue I / O accesses the phase of the queue after 1 second.

And then I think the cycle of events will move to timers(none), I/O callbacks(fs.readFile callback), idle/prepare(none), poll(none), check(setImmediate callback)and, finally, close callbacks(none)in order, but the result is that setImmediate()still running first.

+4
source share
2 answers

, , , , . , FIFO , ​​ . ( ), , ..

, - , . , setImmediate() readFile(), , while .

, (), - ( fs.readFile), idle/prepare (none), poll (none), check (setImmediate callback) , , ( none) , , setImmediate() .

, - -, , , . I/O poll (. ). , -, -, readfile, , .

setImmediate() , readFile().

-, , , , readFile() , setImmediate().

, while :

  • while , , , .
  • -, , . - readFile() . .
  • I/O. readFile() - ( ).
  • checkHandlers, setImmediate().
  • . , - , , readFile().

, , , , . ( ):

const fs = require('fs')

let begin = 0;
function log(msg) {
    if (!begin) {
        begin = Date.now();
    }
    let t = ((Date.now() - begin) / 1000).toFixed(3);
    console.log("" + t + ": " + msg);
}

log('start program');

setTimeout(() => log('timer'), 10);
setImmediate(() => log('immediate'));
fs.readFile(__filename, () => log('readfile'));

const now = Date.now();
log('start loop');
while(Date.now() - now < 1000) {}
log('done loop');

:

0.000: start program
0.004: start loop
1.004: done loop
1.005: timer
1.006: immediate
1.008: readfile

, , .

:

  • 10 ,
  • fs.readFile() ,
  • setImmediate() , ,
  • while
  • while fs.readFile() ( ). , ( )
  • while 1 , Javascript
  • "" . . . ( ). , - "" . , "" .
  • , timer.
  • , . - -. -. , readFile() , ( ).
  • - - . readFile() ( ) /.
  • setImmediate(), . , immediate.
  • ( ).
  • , . .
  • -. readFile(), readfile .
  • , , .

( ), . ( , - , setImmediate() ..). FIFO . - FIFO . ( , ) .

:

enter image description here

. , .

, readfile . , , readFile() , . , - ( ), setImmediate() - . readFile() setImmediate(), while.

, , , readFile() setImmediate(). , while , , , , , .


readFile() setImmediate() setTimeout(). , :

const fs = require('fs')

let begin = 0;
function log(msg) {
    if (!begin) {
        begin = Date.now();
    }
    let t = ((Date.now() - begin) / 1000).toFixed(3);
    console.log("" + t + ": " + msg);
}

log('start program');

setImmediate(() => log('immediate'));
setTimeout(() => log('timer'), 10);

const now = Date.now();
log('start loop');
while(Date.now() - now < 1000) {}
log('done loop');

:

0.000: start program
0.003: start loop
1.003: done loop
1.005: timer
1.008: immediate

( , ).

  • setImmediate() .
  • setTimeout() .
  • while 1000
  • , . , , , timer.
  • , , setImmediate(), immediate.

-, :

// timeout_vs_immediate.js
const fs = require('fs');

fs.readFile(__filename, () => {
  setTimeout(() => {
    console.log('timeout');
  }, 0);
  setImmediate(() => {
    console.log('immediate');
  });
});

, setTimeout() setImmediate() , . setImmediate() , :

 immediate
 timeout

- , " -". setTimeout() setImmediate() -, " -" . , setImmediate() , .

setImmediate() setTimeout() , setImmediate(), . , , , .

+8
setTimeout(() => console.log('timer'), 10);                
fs.readFile(__filename, () => console.log('readfile'));    
setImmediate(() => console.log('immediate'));               

while(Date.now() - now < 1000) {
}

  • setTimeout, 10 .

  • .

  • setImmediate, .

  • . .

  • setImmediate immediate .

  • , , while . readfile .

  • , timer 10 .

  • ( ) . O - .

  • .

  • - . , . .

  • setImmediate .

0

Source: https://habr.com/ru/post/1690472/


All Articles