Кластер Node.js;перемешанный вывод на консоль ТОЛЬКО при использовании цвета - PullRequest
0 голосов
/ 03 октября 2018

Нello!Я запускаю проект кластеризованных узлов с несколькими узлами.Они делают довольно много консольного вывода.Я также хочу иметь возможность делать красивые цветные выводы.

Моя проблема: я получаю путаницу, вывод на консоль гонки-состояния-ТО ТОЛЬКО ПРИ ИСПОЛЬЗОВАНИИ ЦВЕТА.

Я кипятилсявсе, чтобы изолировать мою проблему, и мои текущие настройки для каждого узла в кластере иметь свою собственную уникальную строку.Это единственная строка, которую узел выводит на консоль.

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

Я запускаю группу узлов, которые используют эту функцию, чтобы определить их уникальные строки, и я вижу что-то вроде следующего:

Console output without any jumbling

Разве это не прекрасно!Независимо от того, как долго и как яростно выводятся все эти узлы, этот вывод консоли никогда не перемешивается.

Теперь я пытаюсь использовать уникальные строки, которые содержат лишь небольшой кусочек цвета:

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;
};

И посмотрите, как печально выглядят некоторые из моих результатов!

enter image description here

ЕДИНСТВЕННЫЙ способ передачи данных на терминал через все узлы - через console.log функция.

Почему console.log достаточно умен, чтобы сохранить вывод многих узлов без искажений, когда нет цвета, но недостаточно умен, чтобы делать это, когда даже немного цвета включено?

Спасибо за любую помощь!

(Просто для справки, следующее изображение - это вид не перепутанного вывода, который я ожидаю увидеть последовательно в цветном корпусе; это просто красное поле (два пробела скрасный цвет фона) с префиксом каждой строки:)

enter image description here

РЕДАКТИРОВАТЬ: хотя эта проблема существует в консоли Windows «cmd.exe», в PowerShellконсоль, и в ConEmu (хороший сторонний windoтерминал ws показан на скриншотах), он не существует в терминале Cygwin!В Cygwin никогда не бывает помех, даже с тоннами цветов и асинхронным выходом.Что я могу сделать, чтобы поощрить это поведение Cygwin в других консолях ??

1 Ответ

0 голосов
/ 24 октября 2018

Это условие гонки, и вряд ли вы можете с этим что-либо сделать, кроме как сообщить об ошибке в библиотеку, используемую nodejs.

Хотя сам Windows API фактически поддерживает печать разноцветной строки водин вызов API, как показано здесь: https://docs.microsoft.com/en-us/windows/console/writeconsoleoutput,, где каждый символ содержит информацию о цвете.Но он также не поддерживает управляющие коды ANSI.И это не то, что на самом деле используется javascript.

Движок Nodejs использует библиотеку под названием libuv для записи строк в терминал, которая является кроссплатформенной и внутренне переводит управляющие коды ANSI для правильной работы.Но если вы внимательно посмотрите на источник libuv для обработки escape-кодов ANSI, вы увидите, что он выполняет полную очистку буфера после каждого escape-кода, что означает, что в некоторый момент он должен стать множественными вызовами Windows APIнапечатать одну строку текста.

При нормальных обстоятельствах это, очевидно, не проблема, но если у вас есть несколько потоков, делающих запись, это означает, что части этих строк могут быть перепутаны ... так же, как вы видитеВот.

Итак, ответ здесь заключается в том, что решения не существует.Или вы соглашаетесь с использованием Cygwin в качестве решения.

...