node.js的使用,node是js吗
主线程从‘任务队列’中读取事件,这个过程是无止境的,所以整个运行机制也叫事件循环。下面这篇文章就带你掌握Node.js中的eventloop,希望对你有帮助!
node.js速度课程简介:进入学习
其实在之前的文章中,我也讲过浏览器中的eventloop。但是,NodeJs中的eventloop与浏览器中的不同。对于编写nodejs的人来说,掌握eventloop是一项重要的技能。因为这意味着你不仅可以写js,还可以对NodeJs有研究。
为什么要有eventloop?
我们知道NodeJs的本质是把浏览器的v8搬到操作系统上运行,所以也是走浏览器的事件循环。但是为什么会有eventloop这样的设计呢?
从历史的角度来看,js被设计成一种非常简单的语言来操作页面上的dom(相信大家都听说过js只用10天就设计出来的故事)。出于这个目的,我们当然希望js尽可能简单轻便地运行。有多轻?Light to js的渲染引擎运行在一个线程中。
所以问题来了。如果在一个线程上运行js,当代码是线性的时候,当然没有问题。但是在页面上,我们需要用户交互,而这些交互不知道为什么,什么时候。js应该怎么做呢?如果你面前有正在运行的代码,用户交互后程序应该如何反应?如果先处理用户交互,原程序将被挂起(即被阻塞)。为了避免这种阻塞,js采用了一种方法,就是使用一个消息队列来存储这种用户交互。所有程序运行后,到消息队列获取交互事件,然后执行它们。这就解决了拥堵问题。
浏览器的eventloop
我们都知道,浏览器在浏览页面的时候,用户交互可以随时发生,为了即时响应用户。Js不会关机,会一直循环。大致如下:
从消息队列中获取任务-执行任务-完成执行-从消息队列中获取任务-.当然,正如我们在上一篇关于事件循环的文章中所说,为了对不同的异步任务进行分类,事件循环中实际上是有宏任务和微任务之分的。它们的执行大致如下
从消息队列获取微任务-执行微任务-微任务完成-从消息队列获取宏任务-从消息队列获取微任务-................以下是官方流程图:
可以看到,nodeJs中的每个事件周期都被划分为六个特定的周期,每个周期都会使用指定的宏任务。然后在每个周期的宏任务执行之前,先执行微任务队列。
NodeJs的eventloop
timers执行由setTimeout()和setInterval()触发的回调。延迟到下一次循环迭代的I/O回调pending callbacks只在内部使用,开发者不用关注idle, prepare就可以检索到新的I/O事件;执行I/O相关的回调(几乎所有的回调都会被执行,除了close回调和定时器调度的回调和setImmediate()调度的回调,在这个阶段会在合适的时间被阻塞)。比如poll,check,setImmediate()。事实上,通过上表我们已经清楚地知道了整个事件循环机制的执行情况。但是你可能还是有些疑问。下面详细说说吧。
总览
此阶段实际上处理一些由于操作系统错误而应该在上一个事件循环中执行的回调。例如一些TCP错误。所以开发者无法主动操作的这部分,就是NodeJs的一些容错机制。
pending callbacks
同样,close callbacks是nodejs独有的api,可以立即创建异步宏任务。而且nodejs在事件循环中还有一个特殊的检查期,期间会特别执行socket.on(close, ...)的回调。即使你在此期间一直生成setImmediate个回调,eventloop也会优先处理。
check
此期间处理结算事件,如setImmediate。这确保了在一些通信结束之前完成所有任务。
close callbacks
我们先来回顾一下浏览器和nodejs的区别:
微任务在eventloop中
任务浏览器NodeI/OtimeOutSetInterValsetImmediate question frame
宏任务:
任务浏览器Node process . nexttickmatuationobserver Promise。然后抓住最后,你可以看到这个过程。NextTick是nodejs特有的微任务,不仅如此,setImmediate
微任务:
这两种环境不仅在任务类型上存在差异,在执行上也存在差异。在浏览器上执行任务时,在每个宏任务执行之前,需要确保微任务队列完成。在nodejs上,在每个周期之前,确保微任务队列结束。也就是说,在定时器周期内,setTimeout和setInterval的所有宏任务都会先执行。执行完微任务,进入下一期。
socket.on(close, ...)
执行差异
set immediate()和setTimeout()的执行顺序是不确定的,也就是说,如果你一直执行下面的代码,你得到的结果可能每次都不一样。
setTimeout(()={
console.log(timeout )。
}, 0);
setImmediate(()={
console . log(“immediate”);
});原因是程序在处理时间上有误差。setTimeout方法中设置的时间不一定准确。同时,当回调被触发时,无法确认事件周期处于哪个周期,可能是timer,也可能是check。都会有不同的结果。
setImmediate() vs setTimeout()
eventloop是js运行机制的重点内容,对于NodeJs来说,eventloop的运行空间更大。因为细分为不同的时期,使得我们进一步细化逻辑成为可能。同时,拥有最高优先级的nextTick,可以编写在浏览器中无法实现的代码。所以对于深入NodeJs的开发者来说,eventloop往往是他们考察新人对NodeJs理解的第一步。
更多关于node的信息,请访问:nodejs教程!以上文章带你了解Node.js中eventloop的详细内容请关注我们的其他相关文章了解更多!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。