Узел child_process.spawn: определить, когда все порожденные дочерние процессы закрыты или завершены? - PullRequest
0 голосов
/ 23 октября 2018

Есть ли способ определить, когда все порожденные дочерние процессы закрыты или завершены?

Например, как я могу определить, что больше нет процессов для запуска, или, другими словами, все 500 моих дочерних процессов вышли?

for (let index = 0; index < 500; index++) {
  wkhtmltopdf = spawn('/usr/local/bin/wkhtmltopdf', ['--margin-left', '0', `${index}.html`, `${index}.pdf`])

  wkhtmltopdf.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`)
  })

  wkhtmltopdf.stderr.on('data', (data) => {
    console.log(`stderr: ${data}`)
  })

  wkhtmltopdf.on('close', (code) => {
    console.log(`child process exited with code ${code}`)
  })
}

1 Ответ

0 голосов
/ 05 ноября 2018

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

var num_proc = 500;
var counter = num_proc;

for (let index = 0; index < num_proc; index++) {
  wkhtmltopdf = spawn('/usr/local/bin/wkhtmltopdf', 
                      ['--margin-left', '0', `${index}.html`, `${index}.pdf`]);

  wkhtmltopdf.stdout.on('data', (data) => {
    console.log(`stdout: ${data}`)
  })

  wkhtmltopdf.stderr.on('data', (data) => {
    console.log(`stderr: ${data}`)
  })

  wkhtmltopdf.on('close', (code) => {
    console.log(`child process stdio terminated with code ${code}`)
  })

  wkhtmltopdf.on('exit', (code) => {
    console.log(`child process exited with code ${code}`)
    counter--;

    if (counter <= 0) {
      console.log('everything finished')
    }
  })
}

Я бы использовал событие выхода для уменьшения счетчика (вместо close), поскольку exit запускается при завершении процесса, а close запускается при закрытии потока stdio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...