如何在 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 中侦听和生成多个子进程的主要内容,如果未能解决你的问题,请参考以下文章