node.js - child_process spawn nodejs 中的竞争条件可能性

标签 node.js race-condition fs

我开始学习和使用 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/

相关文章:

node.js - 在字符串列表中查找最相似的文本

c++ - 如何使用 boost atomic 来消除竞争条件?

node.js - Node fs.writeFileSync() 永远不会返回

node.js - 使用 ffmetadata 和 fs 在 nodejs 中读取文件元数据返回未定义

node.js - 当文件中有更新时,如何从nodejs中的fs.watch获取更新的数据

javascript - req.body 是使用 Express 的简单 HTML 表单的空对象

node.js - 将代码从 EJS 转换为 Handlebars

c - C 信号处理程序中的竞争条件难题

javascript - Node 调试: watch expression yields different result from exec console.日志

java - AWS S3 客户端竞争条件解决方案