【问题标题】:node js threading with fork function vs spawn具有 fork 功能的节点 js 线程与 spawn
【发布时间】:2016-12-11 18:12:29
【问题描述】:

我知道 node js fork 函数会创建一个新的 V8 实例,而 spawn 函数不会。说fork 允许您在node js 中使用多线程(在多核机器上)是否正确,因此fork 是您想要执行重负载脚本而不影响你的父脚本的性能?

谢谢。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    Spawn 是一个旨在运行系统命令的命令。当你运行 spawn 时,你向它发送一个系统命令,该命令将在它自己的进程上运行,但不会在你的节点进程中执行任何进一步的代码。您可以为您生成的进程添加侦听器,以允许您的代码与生成的进程交互,但不会创建新的 V8 实例(当然,除非您的命令是另一个 Node 命令,但在这种情况下您应该使用 fork!)和处理器上只有一个节点模块副本处于活动状态。

    Fork 是 spawn 的一个特殊实例,它运行一个全新的 V8 引擎实例。这意味着,您基本上可以创建多个工作人员,在完全相同的 Node 代码库上运行,或者可能为特定任务创建不同的模块。这对于创建工作池最有用。虽然节点异步事件模型允许相当有效地使用机器的单核,但它不允许节点进程使用多核机器。实现这一点的最简单方法是在单个处理器上运行同一程序的多个副本。

    一个好的经验法则是每个内核有一到两个节点进程,对于具有良好 ram 时钟/cpu 时钟比率的机器,或者对于 I/O 繁重而 CPU 工作较少的节点进程,可能更多,以最大限度地减少停机事件循环等待新事件的时间。但是,后一种建议是微优化,需要仔细进行基准测试以确保您的情况适合许多进程/核心的需求。实际上,您可以通过为您的机器/场景生成过多的工作人员来降低性能。

    最终,您可以通过发送 spawn 一个 Node 命令来以上述方式使用 spawn。但这很愚蠢,因为 fork 做了一些事情来优化创建 V8 实例的过程。只是说清楚,最终产卵包括分叉。 Fork 非常适合这个特定且非常有用的用例。

    http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

    取自 - https://stackoverflow.com/a/17861879/2148827

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 2018-07-27
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多