Как запустить параллельный процесс с лимитом? - PullRequest
0 голосов
/ 15 мая 2018

Как запустить параллельный процесс Nodejs, но ограничение количество процессов, существующих в текущем массиве?

Например, у меня есть массив с 200 элементами ['word.doc', 'foo.pdf', 'a.txt', ...], и мне нужно запустить рабочий процесс для каждого элемента следующим образом:

Work.exe word.doc

Work.exe foo.pdf

Work.exe a.txt

Work.exe ....

То, что я сделал, это:

  • forEach в массиве ..
  • вызов exec из child_process lib.

Но я хочу только 5 процессов каждый раз. Когда какой-то процесс закончится, новый элемент должен быть запущен. Поэтому каждый раз у меня есть только 5 процессов, пока все процессы не будут завершены.

Не уверен, как это можно сделать.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

exec принимает обратный вызов, который будет вызываться при выходе из дочернего процесса.Вы можете легко комбинировать это с async eachLimit :

const async = require('async');
const child_process = require('child_process');

// items = ['word.doc', 'foo.pdf', 'a.txt', ...]

async.eachLimit(items, 5, (item, done) => {
    child_process.exec(`Work.exe ${item}`, done);
});
0 голосов
/ 15 мая 2018

lib child_process как событие "close"

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

И когда вы получаете событие «закрытия», вы можете уменьшить счетчик, а если счетчик достигнет 0, вызвать функцию для запуска дочернего процесса N раз.

Вы должны сохранить глобальную переменную для индекса массива. надеюсь, это поможет.

...