node.js - Node child_process 与 Heroku 工作线程

标签 node.js multithreading heroku child-process worker

尝试了解 Node 和 Heroku 上的工作线程与线程。当您从 Node.js 中调用 exec 时会发生什么?

相信它在单独的线程上运行并且不会阻塞主事件循环是否正确?

    require('child_process').exec(cmd, function (err, stdout, stderr) {
      // ... do stuff          
    });

如果在 Heroku 上,将其移至单独的工作程序有优势吗?例如

  • 如果计算密集型,child_process 会减慢主应用程序的速度吗?
  • worker dyno 有自己的内存限制吗?
  • 如果在工作线程中, Uncaught Error (但愿不会)不会导致主应用程序崩溃吗?

最佳答案

在 Node 中,子进程是 CPU 上真正独立的进程,它是父进程(Node.js 脚本)的子进程。本文在这里更深入地解释了这一点:http://www.graemeboy.com/node-child-processes

这在 Heroku 上意味着,如果您使用 child_process 生成一个新的子进程,您的 Heroku dyno 实际上将能够执行“更多”总 CPU 工作,因为它将运行您的子进程代码(很可能)在单独的物理 CPU 上(但这很大程度上取决于您的应用程序中的许多因素)。

但这可能是一个问题,因为每个 Heroku dyno 只有有限数量的 CPU 和 RAM 资源。

例如,如果您的 Dyno 代码(Web 位,而不是单独的 Heroku Worker)正在执行 CPU 密集型操作并大量使用 child_process,那么您将耗尽所有 CPU 资源,并且您的代码将开始在 Node 中阻塞/挂起。

一个更好的想法(虽然在 Heroku 上稍微贵一些)是将所有工作/异步代码放入一个单独的工作 dyno 中,并专门使用它来处理 CPU 密集型的东西。这可以确保您的主要网络测功机始终尽可能快速且响应迅速。

我个人喜欢使用像 Amazon SQS 这样的排队服务处理我的网络测功机和工作测功机之间的数据传递,因为它 super 快且便宜,但您有很多选择。

您创建的每个测功机(网络测功机和工作测功机)都会获得自己的资源,因此每个测功机都会获得自己设定的 CPU 和 RAM 量。可用的测功机类型及其资源限制,解释如下:https://devcenter.heroku.com/articles/dyno-types

关于错误处理,如果没有捕获异常,很难说会发生什么。然而,您的整个 Node 应用程序很可能会崩溃(然后 Heroku 将重新启动它)。这实际上取决于您对各种事物的具体实现=/

关于node.js - Node child_process 与 Heroku 工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33392254/

相关文章:

java - 如何正确使用Java Executor?

multithreading - 内存映射文件的原子操作

node.js - 交互式地执行操作并且它有效。以编程方式执行相同的操作,但失败了。 Redis、heroku、 Node

ruby-on-rails - 为什么Heroku使用服务器时间而不是Rails时区记录日志?

javascript - 从 Node.JS 中的两个网站请求 RSS 提要

javascript - 这个字符串语法在 JavaScript 中意味着什么?

javascript - 使用 Chai 错误进行 Express 单元测试=发送后无法设置 header

ios - 在 NSOperation 中包装异步函数调用

node.js - 是否可以对多个匹配结果进行 pullAll

Herkou "lacks instrumentation functions"上的PostgreSQL