Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Ограничение количества вызовов функции (https://javascript.ru/forum/node-js-io-js/73843-ogranichenie-kolichestva-vyzovov-funkcii.html)

Joss 21.05.2018 11:10

Ограничение количества вызовов функции
 
Доброго времени суток.
Недавно начал знакомиться с Node, разумеется, возникли проблемы с асинхронностью...

Необходимо пройти по элементам массива (2 - 3 тысячи) и обработать каждый элемент с помощью внешних скриптов (pars.parsRo/python pdf_adn_json.py).

const {exec} = require('child_process');
var pars = require("./roParser.js");
...
async.each(line, function(element){
                fullPathXrd.length=0;
                fullPathXrd=localPath+element.proc;
                async.waterfall([
                    function(callback){
                        if ((element.action!="D") && (fs.existsSync(fullPathXrd))){
                            if(fullPathXrd.lastIndexOf(".ro")===fullPathXrd.length-3){
                                pars.parsRo(fullPathXrd, callback);
                            }
                            if(fullPathXrd.lastIndexOf(".pdf")===fullPathXrd.length-4){
                                exec('python pdf_adn_json.py '+fullPathXrd, callback);
                            }
                        }else{
                            callback(null, 'fileNotExist');
                        }
                    },
...


При запуске, скрипт вызывает около тысячи процессов (пока машина не будет загружена полностью). Думаю, что это как-то неправильно...
Подскажите, пожалуйста, можно ли ограничить количество запусков внешних функций?
Если можно, то как?

Заранее спасибо.

EmperioAf 21.05.2018 12:11

Здравствуйте.
Вы используете модуль async, в нем есть очередь.

const WORKERS_COUNT = 10;

const queue = async.queue((element, done) => {
    fullPathXrd.length=0;
    fullPathXrd=localPath+element.proc;
    async.waterfall([
        function(callback){
            if ((element.action!="D") && (fs.existsSync(fullPathXrd))){
                if(fullPathXrd.lastIndexOf(".ro")===fullPathXrd.length-3){
                    pars.parsRo(fullPathXrd, callback);
                }
                if(fullPathXrd.lastIndexOf(".pdf")===fullPathXrd.length-4){
                    exec('python pdf_adn_json.py '+fullPathXrd, callback);
                }
            }else{
                callback(null, 'fileNotExist');
            }
        },
    ...
    ], function(err, result) {
        done(err, result)
    });
}, WORKERS_COUNT);

async.each(line, function(element){
    queue.push(element, callback);             
});

Joss 23.05.2018 11:13

EmperioAf, большое спасибо.
Вопрос решен.


Часовой пояс GMT +3, время: 00:29.