0
でタイマーおよび非同期I/O
と困惑している例を示します。私はここにNode.jsの
const http = require('http');
let startTime = Date.now();
http.createServer((req,res)=>{
console.log('hello');
res.end('nice');
}).listen(8888,()=>{
console.log('server listened at port 8888');
});
setTimeout(function() {
console.log('hei,I am 5000 timeout function' + `time past ${Date.now()-startTime}`);
}, 5000);
setImmediate(()=>{
console.log('hei,I am immediate function' + `time past ${Date.now()-startTime}`);
})
結果:
server listened at port 8888
hei,I am immediate functiontime past 14
hei,I am 5000 timeout functiontime past 5016
が、私の考えでは、setImmediate
コールバックが実行する必要がありますタイムアウトがsetTimeout
によって設定されているため、HTTP非同期ネットワークI/Oがイベントループ5000msをブロックする必要があるため、しかし、この結果は、I/O pool
のイベントループが即座に戻ることを示しています。どうして?イベントループ内のコード:uv_backend_timeout()
で
timeout = 0;
if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT)
timeout = uv_backend_timeout(loop);
uv__io_poll(loop, timeout);
uv__run_check(loop);
:
diff = handle->timeout - loop->time;
if (diff > INT_MAX)
diff = INT_MAX;
return diff;
のでI/O pool
でタイムアウトが、その後uv_epoll_wait()
がcheck
相に行き、その後、5000msのためのイベントループを遮断する必要があり、5000msでなければなりません。だから私はなぜsetImmediate
コールバックがとても早く実行されるのか混乱しています。