BAS nodejs многопоток

Поддержка
  • @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

  • @UserTrue подскажешь что за "особые трюки" ?

  • @rkk9 said in BAS nodejs многопоток:

    @UserTrue подскажешь что за "особые трюки" ?

    Я уже писал где-то, весь код должен инициализироваться один раз, все нужны методы должны быть доступны из global и из него вызываться. Чтобы это реализоватся особенно с асинхронным кодом нужны некоторые знания в js и nodejs