Node.js Event Loop:setTimeout等待期间的去向疑问
Node.js中setTimeout等待期间的位置详解
嘿,这个问题问到点子上了,刚好能帮你拆解清楚Node.js定时器的底层运行逻辑~
当Node.js执行到这段代码时:
setTimeout(() => { console.log('Hello'); },1000);
整个流程是这样的:
调用栈的短暂停留:首先V8引擎会把
setTimeout函数推入调用栈执行,但这个执行过程非常快——V8本身并不负责计时工作,它只是把这个定时器任务委托给Node.js底层的libuv事件循环库。交给系统内核计时:libuv收到任务后,会和操作系统的内核交互,告诉内核:“帮我启动一个1秒的计时器,时间到了通知我”。从这一刻开始,在100ms到1秒的等待时长内,这个定时器的回调函数既不在V8的任何队列里,也不在调用栈中,而是处于系统内核的计时监控状态。此时Node.js的调用栈可以继续处理其他同步任务,完全不会被这个等待过程阻塞。
时间到后的任务入队:当内核的计时器走完1秒,它会立刻通知libuv。libuv这时才会把
setTimeout的回调函数放到Event Loop的**定时器阶段(Timers Phase)**任务队列中。等当前调用栈完全清空,Event Loop运行到定时器阶段时,就会把这个回调函数拉到调用栈里执行,最终打印出Hello。
补充一句:如果是等待到100ms的时候,因为还没到设定的1秒,内核还在持续计时,回调依然处于内核的监控状态,还没进入libuv的任务队列哦。
内容的提问来源于stack exchange,提问作者meddy
相关产品推荐
相关产品推荐

