试着让我了解一下在Node和Heroku上的工作者与线程。从Node.js中调用exec
会发生什么?
认为这是在单独的线程上运行并且不阻止主事件循环是正确的吗?
require('child_process').exec(cmd, function (err, stdout, stderr) {
// ... do stuff
});
如果在Heroku上,将它移到一个单独的工人身上是否有优势? E.g。
答案 0 :(得分:2)
在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工作者)正在执行CPU密集型操作并且大量使用child_process
,那么您将耗尽所有CPU资源并且您的代码将启动阻止/挂起节点。
更好的想法(虽然在Heroku上略贵)是将所有工作/异步代码放入一个单独的工作器dyno,并使用该EXCLUSIVELY处理CPU密集型的东西。这样可以确保您的主要网络动态游戏尽可能快速响应。
我个人喜欢使用像Amazon SQS这样的排队服务来处理我的网络dynos和我的工作人员dynos之间的传递数据,因为它超级便宜,但你有很多选择。
你创造的每个dyno(web dynos和worker dynos)都有自己的资源,所以每个dyno都有自己设定的CPU和RAM。可用的dynos类型及其资源限制,并在此处说明:https://devcenter.heroku.com/articles/dyno-types
关于错误处理,如果你没有捕获异常,说出会发生什么是很棘手的。但是,您的整个Node应用程序很可能会崩溃(然后Heroku将重新启动它)。这实际上取决于你具体实现的各种事情= /