【发布时间】: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