2017-08-06 9 views
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コールバックがとても早く実行されるのか混乱しています。

答えて

0

setTimeout関数はnodejsのノンブロッキング関数です。メインイベントループをブロックしません。本当にイベントループをブロックしたい場合は、wait関数を使用してください。

関連する問題