Node.js集群;仅在使用颜色时控制台输出混乱

Node.js cluster; jumbled console output ONLY when using colour

你好!我正在 运行 构建一个包含多个节点的集群节点项目。他们做了相当多的控制台输出。我也希望能够做出漂亮的彩色输出。

我的问题:我变得混乱,只有在使用颜色时才会出现竞争条件-y 控制台输出。

我一直在努力解决我的问题,我目前的设置是让集群中的每个节点都有自己唯一的字符串。这是节点将输出到控制台的唯一字符串。

let chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let getMyUniqueString = () => {
  return chars[Math.floor(Math.random() * chars.length)].repeat(100);
};

我 运行 一堆节点正在使用这个函数来确定它们的唯一字符串,我看到如下内容:

美不美!无论所有这些节点输出多长时间和多激烈,这个控制台输出永远不会混乱。

现在,我尝试使用仅包含一点点颜色的独特字符串:

let chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let getMyUniqueString = () => {
  let redEscSeq = '\x1b[41m';
  let clearEscSeq = '\x1b[0m';
  let aRedBoxOfText = redEscSeq + '  ' + clearEscSeq;
  let repeatedChars = chars[Math.floor(Math.random() * chars.length)].repeat(100);
  return aRedBoxOfText + repeatedChars;
};

看看我的一些结果看起来多么悲伤!

跨所有节点将数据发送到终端的唯一方式是通过 console.log 函数。

为什么 console.log 足够聪明,可以在没有颜色的情况下使许多节点的输出保持整洁,但在包含一点颜色时却不够聪明,无法做到这一点??

感谢您的帮助!

(仅供参考,下图是我希望在彩色情况下始终看到的那种整洁的输出;它只是每行前面的一个红色框(两个空格,背景颜色为红色):)

编辑:虽然这个问题存在于本机 windows "cmd.exe" 控制台、powershell 控制台和 ConEmu(截图中显示的一个不错的第 3 方 windows 终端) ,它在 Cygwin 终端中不存在!在 Cygwin 中从来没有任何混乱,即使有大量的颜色和异步输出。我能做些什么来鼓励其他控制台中的这种 Cygwin 行为吗??

这是一个竞争条件,你不太可能对此做任何事情,也许除了向 nodejs 使用的库报告错误。

虽然 windows API 本身确实支持在单个 API 调用中打印多色字符串,如下所示:https://docs.microsoft.com/en-us/windows/console/writeconsoleoutput,其中每个字符包含它的颜色信息。但它也不支持 ANSI 转义码。这不是 javascript.

实际使用的

Nodejs 引擎使用一个名为 libuv to write strings to terminal, which is crossplatform and internally translates ANSI escape codes to do the right thing. But if you look closely at the source of libuv 的库来处理 ANSI 转义码,您会看到它会在每个转义码后执行一次完整的缓冲区刷新,这意味着在某些时候它必须变成多个 windows API 调用打印一行文本。

在正常情况下,这显然不是问题,但如果您有多个线程进行写入,则意味着这些行的某些部分可能会变得混乱...就像您在这里看到的那样。

所以这里的答案是无解。或者您接受使用 cygwin 作为解决方案。