Цикл NodeJS значительно замедляется при выполнении дорогих асинхронных вызовов exec? - PullRequest
0 голосов
/ 06 марта 2019

У меня проблемы с приложением NodeJS. Суть приложения заключается в следующем: приложение обнаруживает добавление файла (Layered / Pyramid TIFF) в отслеживаемом каталоге с помощью chokidar. После обнаружения это имя файла добавляется в MariaDB (через модуль mysql) и помечается столбцами «status» и «step».

Затем каждую секунду или даже 2-5 секунд (пробовал со всеми) я опрашиваю SQL (маленькая таблица, в локальной сети, ничего страшного), чтобы получить статус обработки каждого файла. Затем у меня есть шаги, такие как ... вызов библиотеки VIPS для создания изображения пирамиды или вызов ImageMagick для извлечения или преобразования частей изображения. Некоторые из этих команд могут занимать порядка минут и использовать процессор.

Программа значительно замедляется, очень быстро. Даже после того, как процесс exec больше не отображается в верхней части / завершился. Какие-нибудь мысли? Это из-за полного непонимания того, как должен работать async exec?

Код скелета выглядит следующим образом (упрощено, игнорируется обработка ошибок и т. Д.):

doStep1 = function(rows) {
  _.each(rows, function(r) {
  if (I'm not already running more than N of these processes) {
    running_processes++
    return database.markAsInProgress().then(function() {
      return new Promise(function(req, res) {
        exec('some image processing command ' + r.filename, function(err, stdout) {
          running_processes--
          res(let's just say success)
        })
      })
    }).then(function() {
      return database.markAsStepComplete()
    })
  }
}

setInterval(function() { database.getActiveFiles().then(function(rows) { 
  doStep1(_.filter(rows, function(el) { return meets some mutually exclusive criteria; }))
  doStep2(_.filter(rows, function(el) { return meets some mutually exclusive criteria; }))
  ...
  doStepN(...)
}, 1000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...