节点上的标准输出冲突

stdout collisions on node

如果多个进程同时写入标准输出,则没有什么可以阻止流交错。这就是我所说的碰撞。 根据node source中的评论,应该可以避免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

node v5.12.0 Windows10

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

如果您有多个作者到同一个流,我认为您不会交错。即使一个 writer 连续记录多行,这些行也会以正确的顺序被缓冲(如果正在缓冲),当另一个 writer 记录它的行时,它们将被附加到缓冲区,在之前的后面记录行。

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