Node.js和Web浏览器中的单线程是相同的吗?

3
在Web浏览器中,单线程、事件循环和回调的概念与Node.js相同吗?
如果是这样,是因为V8在工作中使用了这个概念(Chrome和Node.js都使用V8)吗?
V8是按照这种方式设计的吗?

1
这不是特定于V8的。每个JS引擎都会表现出这种行为。 - Estus Flask
2
@estus 我认为Rhino有Java的多线程模型,但确实很奇怪。是的,大多数独立的JS实现使用与浏览器中相同的并发模型。 - Bergi
1个回答

4
JavaScript的ECMA-262规定了JS执行的特定行为,将JS的评估定义为一个“Agent”,它本质上是线程的抽象术语。所有主要浏览器的JS引擎都遵循这个规范,并且显然Node.js使用与Chromium相同的引擎。
执行上下文堆栈(简化来说处理函数调用)被作用于代理,因此您无法在多线程环境中真正使用JS。
这就是为什么Web Workers不能传递对象并使用structured clone的原因。
事件循环的概念也在ECMA-262中定义,结合RunJobs()Jobs and Job Queues的行为。工作队列也被作用于代理,因此它们不能处理多线程环境。

目前,在ECMA-262中,Promise是唯一使用作业队列的东西(Promise处理程序总是在新的tick中运行),但Node.js和浏览器大量使用事件循环进行IO操作。


谢谢你的回答。所以你的意思是,(1)JS引擎使用一个称为代理的线程。(2)他们不使用多线程。(3)Node.js和浏览器都喜欢使用事件循环进行I/O...对吗? - Byeongin Yoon
@ByeonginYoon 差不多就是这样。如果你想了解更多,MDN有一个很好的总结:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop - snek
Node是否引入或即将引入浏览器实现中不存在的新概念?我正在观看https://www.youtube.com/watch?v=SULk05iqGIw,我看到许多函数和结构似乎是Node独有的,特别是在v10及其后续版本中。例如,像Workers这样的东西 - 它是否与浏览器中的Web Worker相同? - 使用单独的事件循环。更广泛地说,Node是否朝着代码在Node上运行和在浏览器上运行时不同或不兼容的方向发展? - Rusty Core

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接