Child_process和Worker Threads有什么区别?

59

我正试图理解NodeJS中的线程(Threading)及其工作原理。

目前我所了解的:

Cluster: -

  • 基于Child_process,但使用TCP分布在集群之间。
  • 最适合用于分发/平衡传入的http请求,但不适用于CPU密集型任务。
  • 通过在其他核心上克隆NodeJS Web服务器实例,利用CPU中可用的核心来工作。

Child_process:

  • 也利用可用的不同核心,但不好的是由于创建虚拟内存而花费巨大的资源成本来分叉子进程。

  • 分叉的进程可以通过事件与主线程通信,反之亦然,但分叉的进程之间没有通信。

Worker threads:

  • 与 Child process 相同,但分叉的进程可以使用 bufferArray 进行通信。

1) 为什么worker threadschild process更好,并且我们应该在什么时候使用它们?

2) 如果我们有4个核心并将NodeJS Web服务器集群/分叉4次(每个核心1个进程),然后我们使用了worker threads(没有可用的核心)会发生什么?


5
听起来像是线程和进程之间的经典权衡。线程共享相同的内存空间,因此上下文切换更快(基本上仅保存每个线程的寄存器内容)。然而,在它们之间进行同步并确保互斥(全局数据完整性)是程序员自己的责任。进程在不同的内存空间运行,因此互斥由操作系统保证,但上下文切换当然会变慢。 - goodvibration
1
容错性是进程的主要和基本优点。当代码遭受无法恢复的错误,比如这个网站所命名的那种错误时,操作系统可以干净地终止该代码。内存隔离对于使其正常工作至关重要。但如果一个系统需要多个代码块共同工作,那么它就成为了一个强大的负担。内存隔离显著增加了交互成本。更糟糕的是,当一个进程死亡或停止响应时,恢复起来可能非常困难。 - Hans Passant
1
我找到了一篇博客文章,非常好地解释了它们之间的区别。https://alvinlal.netlify.app/blog/single-thread-vs-child-process-vs-worker-threads-vs-cluster-in-nodejs - lesterfernandez
1个回答

32

您在“worker-threads”下提到,它们与子进程在性质上相同。但实际上它们并不相同。

进程有自己的内存空间,而线程使用共享内存空间。

线程是进程的一部分。进程可以启动多个线程。这意味着在进程下启动的多个线程共享为该进程分配的内存空间。

我猜上面的观点回答了您的第一个问题,即为什么线程模型比进程更受欢迎。

第二个观点:假设处理器可以同时处理4个线程的负载。但我们有16个线程。那么它们所有线程将开始共享CPU时间。

考虑到4核CPU,具有有限线程的4个进程可以更好地利用它,但当线程计数高时,则所有线程将开始共享CPU时间。(当我说所有线程将开始共享CPU时间时,我不考虑进程的优先级和niceness,也不考虑在同一台机器上运行的其他进程。)

关于时间片和CPU负载共享的我的快速搜索:

  1. https://en.wikipedia.org/wiki/Time-sharing
  2. https://www.tutorialspoint.com/operating_system/os_process_scheduling_qa2.htm

本文甚至解答了切换进程如何降低整体性能的问题。

工作线程在本质上类似于任何其他编程语言中的线程。

您可以查看此线程以了解有关线程和进程之间差异的概述: 进程和线程有什么区别?


2
那么你的意思是,在子进程中它使用另一个核心,因此无法与主进程/线程共享内存,而工作线程在同一核心上运行,因此它们可以共享内存?我也知道,在给定的进程中,每次只有一个线程会操作,因此根据Node文档,“worker_threads模块启用了执行JavaScript并行的线程”的意思是什么,如果每次只有一个线程会操作? - Abdelfattah
子进程可以使用IPC与父进程通信,这意味着每个进程都有自己分配的空间,父进程只需创建新进程,操作系统就会维护它们的树形结构,因此称为父进程,否则它们是两个不同的进程。CPU核心和内存共享是两个不同的事情。如果您监视CPU核心负载,则可以观察到负载在核心之间反弹,但一次只有一个线程利用CPU的一个核心(由于NodeJS的性质)。 - Sudhir Dhumal
是的,大多数编程语言使用线程并行执行这个术语是正确的。但是当您有一组需要大量CPU时间的指令加载到线程中,并且硬件无法同时处理所有线程时,线程会共享时间。 - Sudhir Dhumal
3
@Abdelfattah如果这个回答解决了你的问题,请将其标记为已接受。 - Sudhir Dhumal
3
@SudhirDhumal,你并没有具体回答楼主的问题。此外,楼主已经再次发表评论以进行澄清,而你并未作出回应。阅读本帖的回复对我来说是明显的。 - divine

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