node.js中的setImmediate()与process.nextTick()

        Node.js是单线程的,基于事件循环,非阻塞 IO的。事件循环中使用一个事件队列,在每个时间点上,系统只会处理一个事件,即使电脑有多个CPU核心,也无法同时并行的处理多个事件。因此,node.js适合处理I/O型的应用,不适合那种CPU运算密集型的应用。在I/O型的应用中,给每一个输入输出定义一个回调函数,node.js会自动将其加入到事件轮询的处理队列里,当I/O操作完成后,这个回调函数会被触发,系统会继续处理其他的请求。

node.js中定时器问题

        在于它并非精确,例如:setTimeout()设定一个任务在10ms后执行,但是在8ms后,有一个任务占用了5ms,定时器将被耽误3ms。

即时计时器立即执行工作

        即时计时器用来在I/O事件的回调函数开始执行后,但任何超时时间或时间间隔时间被执行之前,立即执行工作。允许把工作调度在事件队列中的当前事件完成之后执行。应该使用计时定时器为其他回调产生长期运行的执行段,以防止I/O事件饥饿。调用setImmediate()时,回调函数被放置在事件队列中,并在遍历队列循环的每次迭代中,在I/O事件有机会被调用后弹出一次。

使用nextTick来调度工作

        nextTick()在I/O事件被触发之前执行,这可能导致I/O事件的饥饿。所以Node.js通过默认值为1000的process.maxTickDepth来限制事件队列的每次循环可执行的nextick()事件的数目。

nextTick()和setImmediate()区别

        nextTick()的回调函数执行的优先级要高于setImmediate()。process.nextTick()属于idle观察者,setImmediate()属于check观察者.在每一轮循环检查中,idle观察者先于I/O观察者,I/O观察者先于check观察者。

        在具体实现上,process.nextTick()的回调函数保存在一个数组中,setImmediate()的结果则是保存在链表中。在行为上process.nextTick()在每轮循环中会将数组中的回调函数全部执行完,而setImmediate()在每轮循环中执行链表中的一个回调函数。

        process.nextTick 是将异步回调放到当前帧的末尾、io回调之前,如果nextTick过多,会导致io回调不断延后,最后callback堆积太多。setImmediate 是将异步回调放到下一帧,不影响io回调,不会造成callback 堆积。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
process.nextTick() 是 Node.js 用于在事件循环的下一次迭代调用回调函数的方法。它接受一个没有时间限制的回调函数作为参数,并将其安排在事件循环的下一次迭代执行。与 setTimeout() 不同,process.nextTick() 的回调函数会在当前迭代结束后立即执行,而不是等待一定的时间间隔。这使得 process.nextTick() 比 setTimeout() 更快,因为它不需要等待定时器的时间到期。\[1\]\[2\] 在 Node.js process.nextTick() 的使用场景包括但不限于以下几种情况: 1. 在当前操作完成后立即执行回调函数,以确保回调函数在下一次事件循环迭代被调用。 2. 在事件循环的不同阶段之间切换执行上下文,以避免阻塞事件循环。 3. 在异步操作的回调函数处理错误,以确保错误能够被捕获并进行适当的处理。 总之,process.nextTick() 是一种用于在事件循环的下一次迭代调用回调函数的方法,它具有快速执行和灵活的使用场景。\[1\]\[2\] #### 引用[.reference_title] - *1* *2* [process.nextTick() 在 Node.js 是如何工作的?](https://blog.csdn.net/weixin_46267040/article/details/125369737)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [详解 setTimeout、setImmediateprocess.nextTick 的区别](https://blog.csdn.net/weixin_39489765/article/details/123235183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值