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

Ou *_* Ye 4 node.js

我正在尝试在 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);
    });
}
Run Code Online (Sandbox Code Playgroud)

Yur*_*bin 8

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 这是因为 `i` 是一个变量,它被提升到每个闭包的作用域。每次 for 循环迭代时,变量都会发生变化。就其性质而言,异步函数在同步代码完成后运行。因此,您的 for 循环将首先运行并触发 10 个函数调用,然后退出。然后事件循环将等待对异步函数的回调触发。当回调最终触发时,它们仍然会引用 `i`,此时它等于 10。通过创建一个以 `i` 作为参数的匿名函数,你实际上是在克隆它,因此它不会改变. (3认同)