如果只有 1 个 cpu 核心,CPU 时间片是否在有或没有工作线程的情况下在 Node.js 上工作?

Does CPU time slicing work on Node.js with or without worker thread if there's only 1 cpu core?

从 Node.js 10.5 开始,他们引入了新的工作线程,使 Node.js 成为多线程环境。

以前,Node.js 上只有一个线程,由于事件驱动的性质(如果我理解正确的话),没有 cpu 时间切片发生。

那么现在 Node 上的多个线程只有一个 cpu 物理内核,它们如何共享 cpu?是每个线程的 OS 调度程序调度时间到 运行 不同的时间量还是什么?

工作线程被公布为

The Worker class represents an independent JavaScript execution thread.

所以就像启动另一个 NodeJS 实例一样,但在同一个进程中,并且只有最少的通信渠道。

NodeJS 中的 Worker 线程模仿现代浏览器中的 Worker API(这不是巧合,NodeJS 基本上是一个没有 UI 和一些额外 JS API 的浏览器)和在这种情况下,工作线程实际上是本机线程,由 OS 调度。

上面引用的描述似乎暗示在 NodeJS 中,工作线程也是用本机线程实现的,而不是由 NodeJS 管理的调度。
后者将毫无用处,因为这 正是 JS 事件循环与异步方法的作用。
所以基本上,工作线程只是同一进程中另一个 native 线程 "instance" NodeJS 运行 的另一个 "instance" (上下文)。
作为本机线程,它由 OS 管理和调度。就像你可以在一个 CPU 中 运行 多个程序一样,你可以使用线程来做到这一点(有趣的事实:在许多 OSes 中,threads是唯一可调度的实体。程序只是一组具有共同地址space和其他属性的线程)。

由于 NodeJS 是开源的,因此很容易确认这一点,请参阅 Worker::StartThread and the Worker::Run 函数。

新线程将像主线程一样执行 JS 代码,但它在与环境(尤其是进程本身)交互的方式上受到限制。
这符合 JS 的多线程方法,它比真正的多线程更 "two or more message loops"(其中线程可以自由地相互交互,在架构级别具有所有含义)。