NodeJS中的多线程与fork进程

Liu*_*zhe 9 node.js

我试图找到一种更好的方法来使用 NodeJS 运行一些 cpu 绑定任务。据我所知,有 2 个选项,fork processesworker threads。所以我在它们之间运行了一个基准测试,发现 fork 过程更快。

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

  1. 为什么fork进程方法更快?
  2. 工作线程没用吗?或者工作线程有什么优势,消耗更少的cpu/内存?

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

基准代码在我的要点中

如您所见,我的代码中使用了线程池库microjob和进程池库node-worker-farm。正在运行的 cmd 是:node --experimental-worker benchmark.js

Liu*_*zhe 8

我认为@gireeshpunathil 来自https://github.com/nodejs/help/issues/1920的评论可以提供很多帮助:

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

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

fork 使用原生 fork 和 exec,这比线程创建更重要。fork 使用新的 v8、isolate、libuv 等创建一个新的节点实例。worker 不会创建新的节点实例。如果需要,分叉进程使用 IPC 通道与分叉进程对话。工作人员使用内存缓冲区。

所以:

  • 如果 microjob 的执行时间与进程创建相比太小,worker 方法会更快。
  • 如果工作与司机沟通,沟通的频率和沟通的成本将决定胜负
  • 如果作业在没有交互的情况下运行为独立的长代码段,fork 方法最终会证明更快(我认为这
    正在发生)