我开始学习和使用 node,我喜欢它,但我不确定某些功能是如何工作的。也许你可以帮我解决一个这样的问题:
我想根据 rest 命令从我的 Node 服务器生成本地脚本和程序。查看 fs 库,我看到了下面的示例,该示例介绍了如何生成子进程并在其上添加一些管道/事件处理程序。
var spawn = require('child_process').spawn,
ps = spawn('ps', ['ax']),
grep = spawn('grep', ['ssh']);
ps.stdout.on('data', function (data) {
grep.stdin.write(data);
});
ps.stderr.on('data', function (data) {
console.log('ps stderr: ' + data);
});
ps.on('close', function (code) {
if (code !== 0) {
console.log('ps process exited with code ' + code);
}
grep.stdin.end();
});
grep.stdout.on('data', function (data) {
console.log('' + data);
});
grep.stderr.on('data', function (data) {
console.log('grep stderr: ' + data);
});
grep.on('close', function (code) {
if (code !== 0) {
console.log('grep process exited with code ' + code);
}
});
令我感到奇怪的是,我不明白如何保证在程序开始运行之前注册事件处理程序代码。它不像有一个“恢复”功能,你可以运行它来启动 child 。这不是竞争条件吗?假设条件非常小并且几乎永远不会被击中,因为它之后的代码片段如此之短,但是,如果是这样,我宁愿不以这种方式进行编码,因为好习惯。
所以:
1)如果不是竞争条件,为什么?
2)如果这是一个竞争条件,我怎么能用正确的方式写出来?
谢谢你的时间!
最佳答案
这不是竞争条件。 Node.js 是单线程的,以先到先得的方式处理事件。新事件放置在事件循环的末尾。 Node 将以同步方式执行您的代码,其中一部分将涉及设置事件发射器。当这些事件发射器发出事件时,它们将被放到队列的末尾,并且在 Node 执行完它当前正在处理的任何代码之前不会被处理,这恰好与注册监听器的代码相同。因此,监听器将始终在处理事件之前注册。
关于node.js - child_process spawn nodejs 中的竞争条件可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28572782/