首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Node.js的事件循环(Event loop)、定时器(Timers)和 process.nextTick()

事件循环通过将操作分给系统内核来处理使得使用单线程的 JavaScript 的 Node.js 可以进行无阻塞 I/O 操作。 由于大部分现代内核都是多线程的,所以可以在后台同时处理多个操作。...当有操作完成时,内核会告诉 Node.js,Node.js 将合适的回调加入轮询队列等待被执行。...实际上有七到八个步骤,但是我们关心的、Node.js 真正用到的这里都讲到了。 事件循环阶段一览 定时器:这一阶段执行由 setTimeout() 和 setInterval() 设置的回调。...在事件循环的每次运行之间, Node.js 会检查是否在等待任何异步 I/O 或定时器,如果两个都没有就自动关闭。...为何 process.nextTick() 还存在 为什么像这样的一个方法还存在于 Node.js 中呢?一部分是因为这是一种设计理念,即 API 即使在不需要的地方也应该始终是异步的。

1.4K30

Node中的事件循环和异步API

1.1 异步I/O 在Node中,JS是在单线程中执行的没错,但是内部完成I/O工作的另有线程池,使用一个主进程和多个I/O线程来模拟异步I/O。...在指定的时间过后,timers会尽早的执行回调,但是系统调度或者其他回调的执行可能会延迟它们。 从技术上来说,poll阶段控制timers什么时候执行,而执行的具体位置在timers。...如果代码没有被设定setImmediate()设定回调: 如果有被设定的timers,那么此时事件循环会检查timers,如果有一个或多个timers下限时间已经到达,那么事件循环将绕回timers...在JS发起调用后,JS调用Node的核心模块,核心模块调用C++内建模块,內建模块通过libuv判断平台并进行系统调用。...在进行系统调用时,从JS层传入的方法和参数都被封装在一个请求对象中,请求对象被放在线程池中等待执行。JS立即返回继续后续操作。

1.6K30

浏览器和 Node.js 的 EventLoop 为什么这么设计?

于是就把宏任务队列拆成了五个优先级:Timers、Pending、Poll、Check、Close。...所以,Node.js 的 Event Loop 的完整流程就是这样的: Timers 阶段:执行一定数量的定时器,也就是 setTimeout、setInterval 的 callback,太多的话留到下次执行...里划分了 5 种宏任务,分别是 Timers、Pending、Poll、Check、Close。...Node.js 的 Event Loop 流程是执行当前阶段的一定数量的宏任务(剩余的到下个循环执行),然后执行所有微任务,一共有 Timers、Pending、Idle/Prepare、Poll、Check...特别要注意的是 Poll 阶段,如果执行到这里,poll 队列为空并且 timers、check 队列也为空,就一直阻塞在这里等待 IO,直到 timers、check 队列有回调再继续 loop 。

39830

宏任务和微任务到底是什么?

首先,我们需要先知道JS运行机制。 JS运行机制 概念1: JS是单线程执行 ”JS是单线程的”指的是JS 引擎线程。 在浏览器环境中,有JS 引擎线程和渲染线程,且两个线程互斥。...概念4:Event Loop JS到底是怎么运行的呢? ? image JS引擎常驻于内存中,等待宿主将JS代码或函数传递给它。...Node.js是运行在服务端的js,虽然用到也是V8引擎,但由于服务目的和环境不同,导致了它的API与原生JS有些区别,其Event Loop还要处理一些I/O,比如新的网络连接等,所以与浏览器Event...阶段了 处理里面的setTimeout,因为本次循环的timers正在执行,所以其回调其实加到了下个timers阶段 处理里面的setImmediate,将它的回调加入check阶段的队列 外层timers...阶段,执行console.log('setTimeout') 但是,如果当前执行环境不是timers阶段,就不一定了。。。。

4.9K52

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券