BAS nodejs многопоток
-
Периодически при использовании много потока
потоки завершаются с ошибкой
Поток завершился с сообщением "Таймаут во время выполнения функции на встроенном языке"Читал на форуме по этому вопросу и там написано что так как nodejs работает в однопоточном режиме, такая вот ошибка случается
У меня используется nodejs для связи с базой mysql и еще для не которых вычислений без которых работа скрипта не возможна.
Подскажите даст ли что нить переход на nodejs v 12
Возможно стоить перевести действия для работы с базой на https://community.bablosoft.com/topic/14993/sql
Возможны Ваши какие то варианты решения данной проблемы вплоть до того что б поднять еще 1 сервер на котором запустить веб сервер на python или том же nodejs, который будет по запросам от BAS у себя выполнять все эти запросы а в BAS уже просто возвращать полученный ответ.
-
не даст, это скрипт чего то ждет (например делает запрос к базе), но не может дождаться ответа, поэтому хоть 12 хоть 8 не поможет
-
Проблему вроде как удалось решить запустив 2 экземпляра программы по 75 потоков.
Пока тестирую.
-
Да теперь все работает как нужно за сутки не было вылетов с ошибкой "Таймаут во время выполнения функции на встроенном языке"
Так что кто активно использует многопоток с nodejs , более чем в 100 потоков, нужно разделять на разные экземпляры приложений.
-
@gomeapat Использую 50 потоков node.js v12, спустя 20-200 минут работы все потоки отваливаются
"Таймаут во время выполнения функции на встроенном языке", причем возвращаясь в цикле на повтор - все равно уйдут в эту же ошибку
Пока не хочу делать отдельно "серверную прогу" для действия
попробую ограничить через глобальную переменную не более 5 node js одновременно, с таймаутом 10 секунд, если и это не поможет, то я тогда уже не знаю как быть)
-
а вы рассматривали вариант вывести в отдельный/ые потоки?
а остальные будут общаться с этими потоками ноды...
-
@Teror2 надо в onApplication все нужные функции записывать в glob, а потом в потоках вызывать их, хоть 500 потоков будет работать без бубнов
-
@tet-vivi в отдельных потоках также само будет вызываться блок node
очередь помогает (сделал не более 5 одновременных node, остальные ожидают), но это мне слабо подходит, так как и без того нагрузка на процессор не доходила 10% но зато node постоянно умирал от таймаута
-
@UserTrue записывать функции в glob
Есть функции, они сами по себе
Есть глобальные переменныеУ меня есть блок node js кода, он вызывается во всех потоках с разными входными параметрами
Что значит "записывать функции в glob "?
-
@Teror2 я имел ввиду глобальные переменные nodejs global.variable =
-
@UserTrue said in BAS nodejs многопоток:
@Teror2 я имел ввиду глобальные переменные nodejs global.variable =
Можете рассказать чуть подробнее с кодом?
У меня есть node код, в котором есть обарщение к файламconst fs = require('fs'); ... fs.existsSync(filename)... fs.readFileSync... fs.writeFileSync...
Я думаю, что много потоков обращаются иногда к одним и тем же файлам поэтому я получаю ошибку "Таймаут во время выполнения функции на встроенном языке".
Node код можно как то изменить чтобы не получать такую ошибку?
-
@Vincent_ Вероятней всего возникает ошибка при выполнение кода, смотрите логи
-
@UserTrue node_log.txt ошибок не содержит
Проблемы начинаются только когда я ставлю много потоков
-
@Vincent_ said in BAS nodejs многопоток:
@UserTrue node_log.txt ошибок не содержит
Проблемы начинаются только когда я ставлю много потоковНе знаю, нужно разбираться. Лично у меня нет на это времени. Nodejs в бас не работает больше чем 255 потоков без особых трюков )
-
@UserTrue said in BAS nodejs многопоток:
@Vincent_ said in BAS nodejs многопоток:
@UserTrue node_log.txt ошибок не содержит
Проблемы начинаются только когда я ставлю много потоковНе знаю, нужно разбираться. Лично у меня нет на это времени. Nodejs в бас не работает больше чем 255 потоков без особых трюков )
Я не прошу разбираться конкретно в моем коде)
У вас коде node есть множественные обращения к файловой системе?
-
@Vincent_ said in BAS nodejs многопоток:
Я не прошу разбираться конкретно в моем коде)
У вас коде node есть множественные обращения к файловой системе?Всякого хватает, можете просто попробовать увеличть таймаут. А кстати зачем вы используете синхронные методы?
-
@UserTrue said in BAS nodejs многопоток:
@Vincent_ said in BAS nodejs многопоток:
Я не прошу разбираться конкретно в моем коде)
У вас коде node есть множественные обращения к файловой системе?Всякого хватает, можете просто попробовать увеличть таймаут.
А кстати зачем вы используете синхронные методы?Уже увеличил, то же самое.
Читаю файл и если он есть, то немного обновляю его, нет - создаю и пишу туда данные
... // имя файла, в который сохраняю результат var crypto = require('crypto'); var hash = crypto.createHash('md5').update([[URL_CURRENT]]).digest('hex'); var filename = [[SAVE_FOLDER]] + hash + '.txt'; const fs = require('fs'); // проверить был ли url загружен ранее if (fs.existsSync(filename)) { console.log("Был загружен ранее " + [[URL_CURRENT]]); if (keyword.length > 0) { // сохранить keyword var content = fs.readFileSync(filename, 'utf8').replace(/^\uFEFF/, ''); var kwRgxp = new RegExp("<!--keywords \[ (.*?) \]-->","i"); if (kwRgxp.test(content)) { // контент уже содержит keywords, новые надо дописать var m = content.match(kwRgxp); var keywords = m[1] + "," + [[KEYWORD]]; keywords = m[1].split(','); keywords = [...new Set(keywords)]; keywords = keywords.join(','); content = content.replace(kwRgxp, "<!--keywords [ " + keywords + " ]-->"); } else { // контент не содержит ключи, дописываю конструкцю в конец content = content + "<!--keywords [ " + [[KEYWORD]] + " ]-->"; } // записать результат в файл fs.writeFileSync(filename, content); } [[URL_CURRENT]] = ''; }
-
@Vincent_ Ну во первых синхронные методы если это простой скрипт, это всегда плохо, они блокируют выполнение. А во вторых ваш код можно выполнить используя встроенные средства БАС
-
@UserTrue Спасибо, я в курсе, что это вссе можно без node. Но мне так и проще и нагляднее
-
@Vincent_ said in BAS nodejs многопоток:
@UserTrue Спасибо, я в курсе, что это вссе можно без node. Но мне так и проще и нагляднее
Что проще это заметно xD