Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.05.2018, 11:10
Аватар для Joss
Новичок на форуме
Отправить личное сообщение для Joss Посмотреть профиль Найти все сообщения от Joss
 
Регистрация: 21.05.2018
Сообщений: 2

Ограничение количества вызовов функции
Доброго времени суток.
Недавно начал знакомиться с 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');
                        }
                    },
...


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

Заранее спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 21.05.2018, 12:11
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Здравствуйте.
Вы используете модуль 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);             
});
Ответить с цитированием
  #3 (permalink)  
Старый 23.05.2018, 11:13
Аватар для Joss
Новичок на форуме
Отправить личное сообщение для Joss Посмотреть профиль Найти все сообщения от Joss
 
Регистрация: 21.05.2018
Сообщений: 2

EmperioAf, большое спасибо.
Вопрос решен.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничение на количество вызовов функции за время < 10мс Basil_JS Общие вопросы Javascript 7 20.03.2015 20:48
Почему не работает ограничение количества символов {n,m} riva Общие вопросы Javascript 1 05.08.2014 19:10
Подсчитать количество вызовов функции внутри функции lohmatiy Javascript под браузер 4 24.02.2014 17:45
ограничение количества нажатий sntyjr Элементы интерфейса 3 13.06.2011 23:09
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21