如何在 nodejs 中侦听和生成多个子进程

Posted

技术标签:

【中文标题】如何在 nodejs 中侦听和生成多个子进程【英文标题】:How do I listen and spawn multiple child process in nodejs 【发布时间】:2015-09-02 16:51:53 【问题描述】:

我正在尝试在 for 循环中执行与 nodejs 中的子进程相同的 java jar 文件,但是如何监听多个子输出???

test.jar 文件在无限循环中运行,它所做的只是增加并打印数字。

下面是我的代码,它确实在nodejs中产生了多个子进程,但它只打印最后一个子进程的pid,其他子进程的内容都添加到最后一个子进程中。

var exec = require('child_process').exec, child;
var state = "java -jar " + "c://test.jar "
var exec = require('child_process').exec;

for (var i = 0; i < 10; i++) 

    var child = exec(state);

    // Add the child process to the list for tracking
    p_list.push(process:child, content:"");

    // Listen for any response:
    child.stdout.on('data', function (data) 
        console.log(child.pid, data);
        p_list[i].content += data;
    );

    // Listen for any errors:
    child.stderr.on('data', function (data) 
        console.log(child.pid, data);
        p_list[i].content += data;
    ); 

    // Listen if the process closed
    child.on('close', function(exit_code) 
        console.log('Closed before stop: Closing code: ', exit_code);
    );

【问题讨论】:

【参考方案1】:

处理异步进程时需要关闭i

for (var i = 0; i < 10; i++) 
    (function(i)
        var child = exec(state);

        // Add the child process to the list for tracking
        p_list.push(process:child, content:"");

        // Listen for any response:
        child.stdout.on('data', function (data) 

            console.log(child.pid, data);
            p_list[i].content += data;
        );

        // Listen for any errors:
        child.stderr.on('data', function (data) 
            console.log(child.pid, data);
            p_list[i].content += data;
        ); 

        // Listen if the process closed
        child.on('close', function(exit_code) 
            console.log('Closed before stop: Closing code: ', exit_code);
        );
    )(i)

【讨论】:

效果很好!但为什么?您能否进一步详细说明这一点,或者指出一些解释该机制的参考资料?谢谢! 这是因为i 是一个变量,它被提升到每个闭包的范围内。每次 for 循环迭代时,变量都会发生突变。就其性质而言,异步函数在同步代码完成之后运行。因此,您的 for 循环将首先运行并触发 10 个函数调用,然后退出。然后事件循环将等待异步函数的回调触发。当回调最终触发时,它们仍将引用 i,此时它等于 10。通过创建一个以 i 作为参数的匿名函数,您实际上是在克隆它,因此它不会改变.【参考方案2】:

您可以尝试查看 Node.JS 的 Cluster API。基本上它让你有一个主进程来启动工人,然后每个工人都是它自己的进程。我想这就是你需要的吗?

【讨论】:

我需要一些适用于 java jar 文件的东西,它在 nodejs 中启动一个 java 进程作为子进程并监听每个进程的输出。不过,我看不到如何在 Cluster API 中为 java jar 文件启动子进程。 啊,好吧,对不起,我以为你的意思是你需要一个单独的节点子进程,它反过来只会运行 jar 文件。

以上是关于如何在 nodejs 中侦听和生成多个子进程的主要内容,如果未能解决你的问题,请参考以下文章

node.js集群模块如何允许多个子进程监听同一个端口?

如何将一个大数组按照里面相同的数据拆分成多个子数组

如何将一个大数组按照里面相同的数据拆分成多个子数组

如何在多处理器系统上生成并行子进程?

NodeJS:如何调试“检测到 EventEmitter 内存泄漏。添加了 11 个侦听器”

在 mongodb-native NodeJS 中为每个子进程使用集群的单个连接池与多个连接池