Как правильно регистрировать сигналы длительно работающей функции в узле красного цвета?Ошибка переполнения памяти кучи и файл остается пустым - PullRequest
0 голосов
/ 29 июня 2019

Мой поток имеет следующую структуру: StartNode (InjectNode) -> LongRunningFunction (Custom) -> LogNode (для записи в файл установлено значение Append)

StartNode: просто узел Inject, который я использую для запуска потока LongRunningFunction: функция создает внутри более длинного цикла for сигнал через node.send (МСГ)

for(let i = 0; i < 5000000; i++){
    node.send({payload: i});
}

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

Файл остается пустым, и сценарий прекращает выполнение через некоторое время. Если я подключаю отладочный узел в качестве второго выхода к функции LongRunningFunction, последний вывод консоли находится в районе 3236831, так как куча памяти заполнена

Есть ли общая проблема со структурой моей программы?

Я даже попытался злоупотребить контекстом, поставив

flow.set("pause", true);
while(flow.get("pause")){
}

в цикл for для ввода кода здесь LongRunningFunction и установки «pause» в значение false снова, когда запускается узел наблюдения за файлами. теоретически, таким образом, он должен отправлять только 1 сигнал за раз и ждать окончания регистрации.

tldr: он никогда ничего не записывает в файл и происходит сбой кучи

Редактировать: Это может быть связано с проблемой: https://nodejs.org/es/docs/guides/backpressuring-in-streams/

текст для node.js, поэтому не уверен, как это относится к node-red или как его исправить

1 Ответ

1 голос
/ 30 июня 2019

Проблема с вашим подходом к долго работающей функции заключается в том, что она никогда не возвращается к циклу событий node.js. Это останавливает все другие действия во время выполнения, и ничто не может сделать никакого прогресса.

Подход цикла while особенно плох; only вещь, которую может сделать среда выполнения, это сидеть в цикле while. Ничто не может произойти вне цикла while для изменения значения контекста, который вы тестируете.

Существует множество различных способов написания долгосрочных функций с использованием таймеров и обратных вызовов, которые позволяют циклу событий node.js продолжать обработку других событий вдоль стороны. Все зависит от того, что вы действительно хотите сделать в своем потоке.

...