【问题标题】:What's the limit of spawning child_processes?产生子进程的限制是什么?
【发布时间】:2013-03-24 22:21:41
【问题描述】:

我必须通过算法进行计算,有人建议我为每个打开的套接字使用一个子进程,我要做的是这样的:

var spawn = require('child_process').spawn;
var child = spawn('node', ['algorithem.js']);

我知道如何向算法进程发送参数以及如何接收结果。

我关心的是,我可以拥有多少个套接字(每个套接字将产生一个进程)? 如何通过我的云托管服务提供商解决此问题?以便我的应用自动缩放?

推荐的node js云托管商有哪些?

最后,这是使用子进程的好方法吗?

【问题讨论】:

    标签: node.js socket.io cloud-hosting


    【解决方案1】:

    是的,当您必须在 node.js 中进行一些繁重的处理时,这是一种公平的方法。但是,启动一个新进程会带来一些开销,因此请注意。您可以打开的套接字(文件描述符)的数量受操作系统的限制。在 Linux 上,可以使用 ulimit-utility 来查看限制。

    另一种方法可以消除对套接字/进程数量的担忧,它是运行单独的算法/计算服务器。这个服务器可以产生 N 个工作线程并监听一个套接字。当接收到计算请求时,这可以例如由第一个可用线程排队和处理。这种方法的一个优点是您的计算服务器可以在任何机器上运行,从而为您的节点实例释放资源。

    【讨论】:

    • 实际上,我使用节点服务器只是为了这个算法计算,但是你说的“这个服务器可以产生 N 个工作线程”是什么意思?不是每个生成进程本身都是一个线程吗?还是我必须自己创建线程?你能写一个简单的例子让它更清楚吗?谢谢
    • 对不起,我的意思是另一个服务器进程。每个派生的进程都是一个单独的进程,但 spawn() 使用 popen-system 调用来提供通信。 Node 是单线程的,因此无法创建普通线程。我的示例背后的动机是提供一种替代方法,您可以减少打开套接字的数量。
    • 您能解释一下如何减少打开的套接字数量吗?一个套接字可以服务多个连接吗?
    • 是的。将请求转发到执行算法的进程的节点实例可以为每个请求添加一个标识符。当回复到达时,您可以匹配此 ID 并将回复发送回正确的客户端。这样,您可以将多个请求多路复用到一个套接字上。
    • 不幸的是,没有一个是容易分享的。但是对于 nodejs 部分,您可以例如查看文档中的 ClientRequest 的连接事件示例:nodejs.org/api/http.html#http_event_connect_1。它应该很容易适应 HTTP 以外的其他协议。例如,您可以在原始请求之前插入一个 id。
    猜你喜欢
    • 2013-05-22
    • 2019-04-08
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多