Chrome浏览器事件循环与节点事件循环之间是否存在显著差异
Are there significant differences between the Chrome browser event loop versus the node event loop?
Philip Roberts在这里出色地解释了浏览器事件循环,在调用堆栈、事件循环、任务队列以及类似webapi的"外部"线程之间提供了清晰的解释。我的问题是,对Node事件循环中的等效组件进行并行处理,它们的调用是否基本相同。也就是说,当我使用Node的文件和web I/o库进行调用时,这些事情是否发生在回调在任务队列中排队的堆栈之外?
当我使用Node的文件和web I/o库进行调用时,这些都是在回调在任务队列中排队的堆栈之外发生的事情?
是的,绝对;它们是异步的,就像Ajax和setTimeout
是异步的一样。它们在调用堆栈之外执行一些操作,完成该操作后,将事件添加到队列中,由事件循环处理。
Node的API提供了一种异步no-op setImmediate
。对于该函数,我上面提到的"一些操作"是"什么都不做",之后一个项目会立即添加到事件队列的末尾。
有一个更强大的process.nextTick
,它将一个事件添加到事件队列的前面,有效地插队并使所有其他排队的事件等待。如果递归调用,这可能会导致其他事件的延迟延长(直到到达maxTickDepth
)。
两者截然不同。浏览器的事件循环不依赖于I/O操作。但是Node js事件循环依赖于I/O操作。这里Nodejs事件循环的主要目标是分离主进程,并尝试异步执行I/O操作和其他定时器API的操作。
另一个区别是我们在浏览器中没有函数setImmediate()。setTimeout()和setImmediate()的区别在于,在setTimeout)中,回调函数将在给定的最小阈值(以毫秒为单位)之后执行。但是在setImmediate()中,一旦完成任何I/O操作,如果在setImediate()内给定了特定的代码,它将首先执行。
因为通常
setTimeout(() => {
//some process
}, 0);
和
setImmediate(() => {
//some process
});
是相同的,我们无法预测哪个将首先执行。但是在nodejs事件循环机制下的nodejs透视图中,如果两者都存在于任何I/O操作的回调下,则setImmediate()将首先执行。所以,
let fs = require('fs');
fs.readFile('/file/path', () => {
setTimeout(() => {
console.log('1');
}, 0);
setImmediate(() => {
console.log('2');
});
});
上述代码的输出为
2
1
这是Erin Zimmer在JS会议上的另一个视频链接。她谈到了使用不同任务(如微任务和宏任务)以及其他环境(如NodeJS、浏览器和Web工作者)实现事件循环。
首先观看OP提到的Philip Roberts的视频,然后观看此视频。
- 事件循环、回调队列和 Javascript 的单线程是如何连接的
- JavaScript运行时事件循环现有技术
- 事件循环的MEAN.JS setInterval进程(从另一个服务器获取数据)
- 页面卸载期间的JavaScript事件循环
- Node.js阻止事件循环
- 了解执行模型和事件循环
- 什么是“;Promise在事件循环的同一个循环上点火“;意思是
- JS调试器是否挂起整个JS事件循环
- js事件循环是否意味着可以为临时暂存空间使用全局变量
- 在 Web 浏览器中收集有关事件循环的信息
- 检测事件循环“滞后”
- “旋转事件循环”是什么意思
- 如何在 nodejs 中维护事件循环中的持久数据
- DOMNode插入的事件循环
- Javascript事件循环任务队列溢出是否可能
- JavaScript 中的事件处理程序如何由事件循环处理
- Node.js 不是文件上传(以及所有基于事件循环的语言)的好选择 - 这是真的
- 为什么 while 循环会阻塞事件循环
- node.js事件循环何时终止
- C#“;事件循环”;与JavaScript“相比较;事件循环”;