节点上的stdout冲突

时间:2016-09-15 13:15:39

标签: node.js stream stdout webstorm winston

如果多个进程同时写入stdout,则没有任何东西可以阻止流进行交错。这就是我所说的碰撞。 enter image description here 根据{{​​3}}中的评论,应该可以避免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上的冲突的最佳方法是什么?

上述例程正在与stdout竞争<IfModule mod_rewrite.c> Options +FollowSymLinks +Indexes RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?$ /index.php?p=$1 [L] </IfModule>

节点v5.12.0 Windows 10

只有在webstorm中使用Run控制台时才会出现此问题,在powershell或cmd中运行节点时输出不会混淆。我在jetbrains为此提出了node source

1 个答案:

答案 0 :(得分:3)

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

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