【问题标题】:How do I listen and spawn multiple child process in nodejs如何在 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);
    });
}

【问题讨论】:

    标签: node.js


    【解决方案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 文件。
    猜你喜欢
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2019-01-13
    相关资源
    最近更新 更多