NodeJS中的多线程与派生过程

时间:2019-05-17 06:54:25

标签: node.js

我正在尝试找到一种更好的方法来使用NodeJS运行一些cpu绑定的任务。据我所知,有两个选项,分别是 fork process (叉处理)和worker threads。因此,我在他们之间进行了基准测试,发现分叉过程更快。

所以,我在这里有一些问题:

  1. 为什么分叉处理方法更快?
  2. 工作线程没有用吗?还是工作者线程的优势是什么?消耗更少的cpu /内存?

我正在使用节点v10.15.3在MacOS(2.2 GHz Intel Core i7,16 GB 1600 MHz DDR3)上运行代码

基准代码在我的gist中:

如您所见,我的代码中使用了

线程池库microjob和进程池库node-worker-farm。正在运行的cmd为:node --experimental-worker benchmark.js

1 个答案:

答案 0 :(得分:0)

我认为https://github.com/nodejs/help/issues/1920的@gireeshpunathil的评论会有所帮助:

  

没有一个公式可以计算哪种方法更快。   它取决于许多参数:

     
      
  • 作业本身的运行时间
  •   
  • 工作与生成代码的交互
  •   
  • 机器特征,特别是cpu,内存和调度
  •   
     

fork使用本机fork和exec,比线程重   创建。 fork使用新的v8,isolate,libuv创建一个新的节点实例   等等。worker不会创建新的节点实例。分叉过程使用IPC   如有必要,可以与分叉过程进行交流。工人使用   内存中的缓冲区。

     

所以:

     
      
  • 如果微作业的执行时间与流程创建相比太短,则worker方法将更快。
  •   
  • 如果工作与驾驶员沟通,沟通的频率和沟通的成本将决定获胜者
  •   
  • 如果作业运行了很长的独立代码而没有交互,那么fork方法最终将证明更快(我认为
      发生在这里)
  •