div*_*ine 2 multithreading worker-thread node.js
假设我有nodejs
serverProgram
一个 api,它对通过 http 请求发送的视频文件进行了一些操作。
const saveVideoFile=(req,res)=>{
processAndSaveVideoFile(); // can run for minimum of 10 minutes
res.send({status: "video is being processed"})
}
Run Code Online (Sandbox Code Playgroud)
我决定使用 aworkerThread
来做这个处理,因为我的机器有 3 个内核(core1、core2、core3)并且这里没有启用超线程
假设我的 nodejs 程序在core1
. 当我火了一个单一的WorkerThread,将在运行的WorkerThreadcore2/core3
还是core1
?
我读到 workerThread 与 childProcess 不同。ChildProcess 将派生一个新进程,这将有助于 childProcess 从可用的免费内核(core2 或 core3)中进行选择。
我读到 workerThread 与 mainThread 共享内存。假设我创建了 2 个 workerThreads (wt1,wt2)。我的 nodejs 程序 wt1、wt2 会在同一个核心上运行core1
吗?
此外,在 nodejs 中,我们有 eventloop(主线程)和 otherThreads 执行后台操作,即 I/O。假设所有这些都在利用单个内核 (core1) 中可用的资源是否正确。如果是这种情况,是否在 nodejs 服务器上创建和使用额外的 workerThread 是一种矫枉过正?
下面是这个博客的摘录
我们可以在 Node.js 中并行运行。但是,我们不需要创建线程。操作系统和虚拟机共同并行运行 I/O,然后当需要将数据发送回 JavaScript 代码时,JS 代码会在单个线程中运行。
我一直在许多文章和视频演示中阅读有关 nodejs 的相同信息。但我不明白的是,
The operating system and the virtual machine collectively run the I/O in parallel
操作系统如何在不使用任何从 nodejs 产生的 childProcess 或线程的情况下并行运行来自 nodejs 程序的 I/O 请求?如果来自 nodejs 程序的那些 I/O 请求并行运行,是否意味着将使用所有 3 个内核(core1、core2、core3)?
nodejs上的内容很多,但没有解决我上述问题的疑问。如果您对这些事情有什么想法actually work
,请分享详细信息。
node.js 中的工作线程是在 V8 的不同实例中运行的实际操作系统线程。因此,完全由操作系统决定如何在可用的 CPU 内核之间分配它。如果有可用时间的内核,那么当该线程繁忙时,它通常不会与主 nodejs 线程在同一内核上运行,因为操作系统将在各个内核之间分配繁忙的线程。
但是,这完全取决于操作系统,而不是 nodejs 控制的,使用内核的确切策略因操作系统而异。但是,在所有现代操作系统中,设计目标是将可用内核用于当前正在执行的线程。现在,如果同时活动的线程数多于核心数,则线程将被时间切片,所有核心都将处于活动状态。
此外,在 nodejs 中,我们有 eventloop(主线程)和 otherThreads 执行后台操作,即 I/O。假设所有这些都在利用单个内核 (core1) 中可用的资源是否正确。如果是这种情况,是否在 nodejs 服务器上创建和使用额外的 workerThread 是一种矫枉过正?
不,假设这些线程都使用相同的内核是不正确的。
nodejs 中的 workerThread 有自己的事件循环。在大多数情况下,它不共享内存。事实上,如果你想共享内存,你必须非常明确地分配 SharedMemory 并将其传递给 workerThread。
是否矫枉过正?嗯,这取决于你在做什么。workerThreads 有一些非常有用的事情,但有些事情是不需要的。
操作系统和虚拟机共同并行运行 I/O
node.js 中的 I/O 要么在 OS 级别异步(例如网络),要么在单独的线程中运行(例如磁盘 I/O)。这意味着它与运行 Javascript 的 node.js 中的主线程分开运行,并且可以与其并行运行,仅在事件完成时同步。在这种情况下,“并行”意味着两者同时取得进展。如果有多个内核,那么它们就可以真正同时运行。如果只有一个内核,那么操作系统将在各个线程之间进行时间片划分,并且它们都将取得进展(以一种交错的方式,这似乎是并行的,但实际上它们是轮流的)。
操作系统如何在不使用任何从 nodejs 产生的 childProcess 或线程的情况下并行运行来自 nodejs 程序的 I/O 请求?如果来自 nodejs 程序的那些 I/O 请求并行运行,是否意味着将使用所有 3 个内核(core1、core2、core3)?
操作系统有自己的线程来管理诸如网络接口或磁盘接口之类的东西。这些线程的工作是与硬件接口并将数据带到适当的应用程序或从应用程序获取数据并将其发送到硬件。这些是独立于 node.js 存在的操作系统级线程。是的,这些操作系统级线程可以使用其他内核。认识到许多操作(例如网络)本质上是非阻塞的,这一点很重要。因此,如果您正在等待某些数据到达网络接口,则不需要让线程一直在做某事。
我想补充一点,在您的问题中,您将有关几个不同事物的问题组合在一起。在您的问题中提到的是:
这些都是不同的东西。
工作线程是一个新线程,您可以开始在另一个线程中运行特定的 Javascript 片段,因此您可以同时运行多个 Javascript 线程。在 node.js 中,这是通过创建一个全新的 V8 实例、设置一个全新的全局环境和加载模块环境并使用几乎完全独立的内存来完成的。
node.js使用内部 node.js 线程作为实现其事件循环和标准库的一部分。具体来说,磁盘 I/O 和一些加密操作在内部本机线程中运行,它们通过事件循环通过事件/回调与您的 Javascript 通信。
操作系统线程是操作系统用来实现它自己的系统 API 的线程。由于操作系统负责很多事情,这些线程可以有许多不同的用途。根据本机实现,它们可用于促进诸如磁盘 I/O 或网络 I/O 之类的事情。这些线程由操作系统负责创建和使用,不受 node.js 的直接控制。
评论中提出的一些其他问题:
nodejs 中的黑白 workerThread 和 childProcess 概念有什么区别?childProcess = workerThread 是没有 sharedMemory 吗?
子进程可以是任何类型的程序 - 它不必是 node.js 程序。工作线程是 node.js 代码。
如果 sharedMemory 专门分配并与工作线程共享,并且针对并发问题对其进行了仔细管理,则工作线程可以共享内存。
在工作线程和主线程之间来回复制内存比使用子进程更有效。
如果主程序退出,工作线程将退出。如果主程序退出,可以配置子进程退出或继续。
如果工作线程调用process.exit()
,主线程也会退出。如果子程序退出,在没有主程序配合的情况下不能导致主程序退出。
nodejs 如何在不创建任何线程的情况下与 os 级线程神奇地交互?,我需要有关此的更多详细信息,您的解释是大多数地方(包括我共享的博客)中常见的解释?
nodejs 只是调用一个 OS API。操作系统 API 管理与其自己的线程通信(如果该特定操作系统 API 需要线程)。它如何在内部进行通信取决于实现,并且会因操作系统而异。它甚至会因操作系统而异,哪些操作系统 API 使用线程,哪些不使用。
归档时间: |
|
查看次数: |
145 次 |
最近记录: |