当在nodejs中创建一个workerThread时,它是否使用与nodejs进程相同的内核运行?

When a workerThread is created in nodejs, does it utilize the same core in which nodejs process is running?

假设我有一个 nodejs serverProgram 和一个 api 并且它对通过 http 请求发送的视频文件进行了一些操作。

const saveVideoFile=(req,res)=>{
  processAndSaveVideoFile(); // can run for minimum of 10 minutes
  res.send({status: "video is being processed"})
}

我决定使用 workerThread 来执行此处理,因为我的机器有 3 个核心(核心 1、核心 2、核心 3)并且这里没有启用超线程

假设我的 nodejs 程序在 core1 上 运行ning。当我启动单个 workerThread 时,workerThread 运行 会在 core2/core3 还是 core1 上?

我读到 workerThread 与 childProcess 不同。 ChildProcess 将派生一个新进程,这将有助于 childProcess 从可用的空闲核心(core2 或 core3)中进行选择。

我读到 workerThread 与 mainThread 共享内存。假设我创建了 2 个 workerThreads (wt1,wt2)。我的 nodejs 程序 wt1, wt2 运行 会在同一个核心上,即 core1 吗?

此外,在 nodejs 中,我们有事件循环(主线程)和其他线程执行后台操作,即 I/O。假设所有这些都在利用单个核心 (core1) 中的可用资源是否正确?如果是这种情况,在 nodejs 服务器上创建和使用额外的 workerThread 是否有点矫枉过正?

以下摘自this blog

We can run things in parallel in Node.js. However, we need not to create threads. The operating system and the virtual machine collectively run the I/O in parallel and the JS code then runs in a single thread when it is time to send the data back to the JavaScript code.

我一直在阅读许多文章和视频演示中有关 nodejs 的相同信息。但是我不明白的是,

The operating system and the virtual machine collectively run the I/O in parallel

操作系统如何 运行 I/O 从 nodejs 程序并行请求而不使用任何从 nodejs 派生的 childProcess 或线程?如果来自 nodejs 程序的那些 I/O 请求是 运行 并行的,这是否意味着所有 3 个核心(核心 1、核心 2、核心 3)都将被利用?

nodejs上的内容很多,但是并没有解决我上述问题的疑惑。如果您对这些事情有想法 actually work,请分享详细信息。

node.js 中的工作线程是 V8 的不同实例中的实际 OS 线程 运行。因此,完全由操作系统决定如何在可用 CPU 内核之间分配它。如果有可用时间的核心,那么当该线程繁忙时,它通常不会 运行 在与主 nodejs 线程相同的核心上,因为 OS 将在各个核心之间分配繁忙的线程。

但是,这又完全取决于 OS 而不是 nodejs 控制的东西,使用内核的确切策略将因 OS 而异。但是,在所有现代操作系统中,设计目标是将可用内核用于当前正在执行的线程。现在,如果同时活动的线程数多于内核数,线程将按时间切片,所有内核都将处于活动状态。

Also, in nodejs we have eventloop (mainthread) and otherThreads doing the background operations i.e I/O. is it correct to assume that all of these are utilizing the resources available in a single core (core1). if this is the case, is creating and using additional workerThread's an overkill on the nodejs server?

不,假设这些线程都使用相同的核心是不正确的。

nodejs 中的 workerThread 有自己的事件循环。在大多数情况下,它不共享内存。事实上,如果你想共享内存,你必须非常具体地分配 SharedMemory 并将其传递给 workerThread。

是不是矫枉过正了?嗯,这取决于你在做什么。 workerThreads 可以做一些非常有用的事情,也可以做一些不必要的事情。

The operating system and the virtual machine collectively run the I/O in parallel

node.js 中的

I/O 要么在 OS 级别异步(例如网络),要么 运行 在单独的线程中(例如磁盘 I/O ).这意味着它 运行 与 node.js 中的主线程分开 运行 你的 Javascript 并且可以 运行 与其并行,仅在完成时同步的一个事件。 "Parallel" 在这种情况下意味着两者同时取得进展。如果有多个核心,那么它们就可以真正 运行ning 在同一时间。如果只有一个核心,那么 OS 将在各个线程之间进行时间片,并且它们都将取得进展(以一种看似并行的交错方式,但实际上它们是轮流进行的)。

How can the operating system run the I/O requests from nodejs program in parallel without using any of the childProcess or threads spawned from nodejs? if those I/O requests from nodejs program is running in parallel, does it mean that all 3 cores (core1,core2,core3) will be utilized?

OS 有自己的线程来管理诸如网络接口或磁盘接口之类的东西。这些线程的工作是与硬件接口并将数据带到适当的应用程序或从应用程序获取数据并将其发送到硬件。这些是独立于 node.js 存在的 OS 级线程。是的,那些 OS 级别的线程可以使用其他内核。重要的是要认识到许多操作(例如网络)本质上是非阻塞的。因此,如果您正在等待一些数据到达网络接口,则不需要让线程一直在做某事。


我想补充一点,在您的问题中,您将几个不同的问题组合在一起。您的问题中提到的是:

  1. 工作线程
  2. 内部 node.js 线程
  3. 操作系统线程

这些都是不同的东西。

A worker thread 是一个新线程,您可以在另一个线程中开始 运行 Javascript 的特定部分,这样您就可以拥有更多一个 Javascript 线程 运行 同时。在 node.js 中,这是通过创建一个全新的 V8 实例、设置一个全新的全局环境和加载模块环境并使用几乎完全独立的内存来完成的。

内部node.js线程被node.js用作实现其事件循环和标准库的一部分。具体来说,磁盘 I/O 和一些加密操作在内部本机线程中是 运行,它们通过事件循环通过 events/callbacks 与您的 Javascript 通信。

操作系统线程 是 OS 用来实现其自己的系统 API 的线程。由于 OS 负责很多事情,这些线程可以有许多不同的用途。根据本机实现,它们可用于促进诸如磁盘 I/O 或网络 I/O 之类的事情。这些线程由 OS 负责创建和使用,不受 node.js 直接控制。


评论中提出的一些其他问题:

what is the difference b/w workerThread & childProcess concept in nodejs? is childProcess = workerThread without sharedMemory ?

子进程可以是任何类型的程序 - 它不必是 node.js 程序。工作线程是 node.js 代码。

如果 sharedMemory 专门分配并与工作线程共享,并且针对并发问题进行了仔细管理,则工作线程可以共享内存。

在工作线程和主线程之间来回复制内存比子进程更有效。

如果主程序退出,工作线程也会退出。如果主程序退出,子进程可以配置为退出或继续。

如果工作线程调用process.exit(),主线程也会退出。如果子程序退出,则不能在没有主程序配合的情况下导致主程序退出。

how nodejs is able to magically interact with the os level thread without nodejs itself creating any threads?, i need additional details on this, your explanation is the common one present in most places including the blog i shared?

nodejs 只是调用一个 OS API。 OS API 管理与其自身线程的通信(如果特定 OS API 需要线程)。它如何在内部进行通信取决于实现,并且会因 OS 而异。它甚至会因 OS 而异,哪些 OS API 使用线程,哪些不使用线程。