Node.js 子线程和工作线程之间有什么区别?

Node.js 子线程和工作线程之间有什么区别?,node.js,multithreading,Node.js,Multithreading,我试图理解NodeJS中的线程,以及它是如何工作的 目前我的理解是: 群集:- 构建在Child_进程之上,但TCP分布在集群之间 最适合分发/平衡传入http请求,而不适合cpu密集型任务 工作原理是利用cpu中的可用内核,在其他内核上克隆nodeJS Web服务器实例 子进程: 还可以使用不同的可用内核,但这是不好的,因为它会创建虚拟内存,因此派生子进程需要耗费大量资源 分叉进程可以通过事件与主线程通信,反之亦然,但分叉进程之间没有通信 工作线程: 与子进程相同,但分叉进程可以使用

我试图理解NodeJS中的
线程
,以及它是如何工作的

目前我的理解是:

群集:-

  • 构建在Child_进程之上,但TCP分布在集群之间
  • 最适合分发/平衡传入http请求,而不适合cpu密集型任务
  • 工作原理是利用cpu中的可用内核,在其他内核上克隆nodeJS Web服务器实例
子进程:

  • 还可以使用不同的可用内核,但这是不好的,因为它会创建虚拟内存,因此派生子进程需要耗费大量资源

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

工作线程:

  • 与子进程相同,但分叉进程可以使用
    bufferArray
1) 为什么
工作线程
优于
子进程
以及何时应该使用它们


2) 如果我们有4个核心和集群/分叉的nodeJS Web服务器4次(每个核心1个进程),那么我们使用了
工作线程(没有可用的核心)?

您提到了工作线程下的一点,即它们在本质上与子进程相同。但事实并非如此

进程有自己的内存空间。另一方面,线程使用共享内存空间

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

我想以上这一点回答了您的第一个问题,为什么线程模型比进程更受欢迎

第二点:假设处理器一次可以处理4个线程的负载。但是我们有16条线。然后所有人都将开始共享CPU时间

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

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

  • 本文甚至回答了进程之间的切换如何降低总体性能

    工作线程本质上与任何其他编程语言中的线程相似

    你可以看一看这篇文章,全面了解它 线程和进程之间的区别:

    听起来像是线程和进程之间的经典权衡。线程共享相同的内存空间,因此上下文切换更快(基本上,每个线程只保存寄存器内容)。但是,它们之间的同步和确保互斥(全局数据完整性)是您自己的责任(作为程序员)。进程在不同的内存空间中运行,因此互斥是由操作系统保证的,但上下文切换当然较慢。容错是进程的主要和基本好处。当代码遇到不可恢复的错误时,如该网站的命名错误,则操作系统可以干净地终止该代码。内存隔离对于使其正常工作至关重要。但是,如果一个系统需要多个代码块一起工作,那么它将成为一个巨大的负担。内存隔离大大增加了交互成本。更糟糕的是,当一个进程死亡或停止响应时,恢复可能非常困难。那么,您的意思是在
    子进程中,它使用另一个内核,因此不能与主进程/线程共享内存,而
    工作线程在同一个内核上运行,以便它们可以共享内存吗?我还知道,在一个给定的进程中,一次只有一个线程会运行,因此根据节点文档
    worker\u threads module允许使用并行执行JavaScript的线程
    如果一个时刻只有一个线程运行,那么并行执行代码的意思是什么。子进程可以使用IPC与父进程通信,这意味着每个进程都有自己分配的空间,父进程只创建新进程,操作系统维护其树,因此称其为父进程,否则它们是两个不同的进程。CPU核心和内存共享是两件不同的事情。如果监视CPU核心负载,则可以观察到负载在核心之间反弹,但一次只有一个线程正在使用CPU的一个核心(因为NodeJ的性质)。是的,大多数编程语言都使用线程并行执行这一术语,这是正确的。但是,当您的线程加载了一组需要大量CPU时间的指令,并且硬件无法一次处理所有线程时,那么在这种情况下,线程共享时间。@Abdelfattah,如果这是您一直在问的问题,请您将答案标记为已接受。@Sudhirdumal您没有真正回答OP的问题明确地此外,OP再次发表评论,澄清您尚未对此作出回应。这一点在我读到这篇文章的回复时是显而易见的。