我正在尝试找到一种更好的方法来使用NodeJS运行一些cpu绑定的任务。据我所知,有两个选项,分别是 fork process (叉处理)和worker threads。因此,我在他们之间进行了基准测试,发现分叉过程更快。
所以,我在这里有一些问题:
我正在使用节点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
答案 0 :(得分:0)
我认为https://github.com/nodejs/help/issues/1920的@gireeshpunathil的评论会有所帮助:
没有一个公式可以计算哪种方法更快。 它取决于许多参数:
- 作业本身的运行时间
- 工作与生成代码的交互
- 机器特征,特别是cpu,内存和调度
fork使用本机fork和exec,比线程重 创建。 fork使用新的v8,isolate,libuv创建一个新的节点实例 等等。worker不会创建新的节点实例。分叉过程使用IPC 如有必要,可以与分叉过程进行交流。工人使用 内存中的缓冲区。
所以:
- 如果微作业的执行时间与流程创建相比太短,则worker方法将更快。
- 如果工作与驾驶员沟通,沟通的频率和沟通的成本将决定获胜者
- 如果作业运行了很长的独立代码而没有交互,那么fork方法最终将证明更快(我认为
发生在这里)