【问题标题】:stdout collisions on node节点上的标准输出冲突
【发布时间】:2016-09-15 13:15:38
【问题描述】:

如果多个进程同时写入标准输出,则没有什么可以阻止流交错。这就是我所说的碰撞。 根据node source 中的cmets,应该可以避免process.stdout 中的冲突。我试过这个,它有帮助,但我仍然会遇到碰撞。如果没有writing 标志,我每次都会发生碰撞,标志下降到大约 40%。还是很重要的。

page.on('onConsoleMessage', function log(message) {
  var writing = process.stdout._writableState.writing
    || process.stdout._writableState.bufferProcessing
    || process.stdout.bufferSize ;
  if(writing)
    process.nextTick(message => log(message));
  else
    process.stdout.write('-> ' + message + '\n')
});

process.stdout 上避免冲突的最佳方法是什么?

上述例程与Winston竞争stdout

节点 v5.12.0 视窗 10

此问题仅在使用 webstorm 中的运行控制台时发生,在 powershell 或从 cmd 中运行节点时输出不会混淆。我为此在 jetbrains 提出了ticket

【问题讨论】:

  • 你能定义什么是碰撞吗?
  • @robertklep,你见过The Fly吗?
  • 哈哈,我明白了;D 所以你得到了不同日志行之间的字符交错?或者行交错,你用一个记录器记录多行,然后它们被另一个记录器交错?
  • @robertklep 是的,没错。我也尝试使用console.log,但得到了相同的结果:大约 40% 的时间发生碰撞。其实不是字符级交错,打断消息打印完成,然后打断的on resume。
  • 如果您使用每个记录器记录多行,我认为您无法采取任何措施来防止 line 交错(因为记录单行通常是一个孤立的操作: logger.log('line1'); logger.log('line 2'), ...)。然而,奇怪的是一个记录器能够“中断”另一个记录器的行,因为它们都以半原子方式写入同一个流(除非 write 为单个日志行多次调用, 除非一个记录器正在写入stdout,而另一个记录器正在写入stderr)。

标签: node.js stream stdout webstorm winston


【解决方案1】:

如果您有多个写入器到同一个流,我认为您不会出现交错。即使单个写入器连续记录多行,这些行也会以正确的顺序被缓冲(如果正在进行缓冲),并且当另一个写入器记录其行时,它们将被附加到缓冲区,在前面的后面记录的行。

交错可能在您让写入器写入不同的流时发生,例如一个写入stdout 而另一个写入stderr。在某些时候,当一个流的输出缓冲区填满时,它会被刷新到控制台,而不管其他任何可能也正在写入控制台的流。

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多