У меня проблемы с приложением 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)