Node.js - Aplicação de Escalonamento

O Node.js é executado em um modo de thread único, mas usa um paradigma orientado a eventos para lidar com a simultaneidade. Ele também facilita a criação de processos filho para aproveitar o processamento paralelo em sistemas baseados em CPU de vários núcleos.

Os processos filho sempre têm três fluxos child.stdin, child.stdout, e child.stderr que pode ser compartilhado com os streams stdio do processo pai.

Node fornece child_process módulo que possui as seguintes três maneiras principais de criar um processo filho.

  • exec - o método child_process.exec executa um comando em um shell / console e armazena a saída em buffer.

  • spawn - child_process.spawn inicia um novo processo com um determinado comando.

  • fork - O método child_process.fork é um caso especial de spawn () para criar processos filhos.

O método exec ()

O método child_process.exec executa um comando em um shell e armazena a saída em buffer. Possui a seguinte assinatura -

child_process.exec(command[, options], callback)

Parâmetros

Aqui está a descrição dos parâmetros usados ​​-

  • command (String) O comando a ser executado, com argumentos separados por espaço

  • options (Objeto) pode compreender uma ou mais das seguintes opções -

    • cwd (String) Diretório de trabalho atual do processo filho

    • env (Objeto) Pares de valores-chave do ambiente

    • encoding (String) (Padrão: 'utf8')

    • shell (String) Shell para executar o comando com (Padrão: '/ bin / sh' no UNIX, 'cmd.exe' no Windows, O shell deve compreender a opção -c no UNIX ou / s / c no Windows. No Windows, a análise da linha de comando deve ser compatível com cmd.exe.)

    • timeout (Número) (Padrão: 0)

    • maxBuffer (Número) (Padrão: 200 * 1024)

    • killSignal (String) (Padrão: 'SIGTERM')

    • uid (Número) Define a identidade do usuário do processo.

    • gid (Número) Define a identidade do grupo do processo.

  • callback A função obtém três argumentos error, stdout, e stderr que são chamados com a saída quando o processo termina.

O método exec () retorna um buffer com um tamanho máximo e espera o processo terminar e tenta retornar todos os dados do buffer de uma vez.

Exemplo

Vamos criar dois arquivos js chamados support.js e master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

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

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js '+i,function 
      (error, stdout, stderr) {
      
      if (error) {
         console.log(error.stack);
         console.log('Error code: '+error.code);
         console.log('Signal received: '+error.signal);
      }
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
   });

   workerProcess.on('exit', function (code) {
      console.log('Child process exited with exit code '+code);
   });
}

Agora execute o master.js para ver o resultado -

$ node master.js

Verifique a saída. O servidor foi iniciado.

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

O método spawn ()

O método child_process.spawn inicia um novo processo com um determinado comando. Possui a seguinte assinatura -

child_process.spawn(command[, args][, options])

Parâmetros

Aqui está a descrição dos parâmetros usados ​​-

  • command (String) O comando a ser executado

  • args (Array) Lista de argumentos de string

  • options (Objeto) pode compreender uma ou mais das seguintes opções -

    • cwd (String) Diretório de trabalho atual do processo filho.

    • env (Objeto) Pares de valores-chave do ambiente.

    • stdio (Array) Configuração de stdio de String Child.

    • customFds (Matriz) Descritores de arquivo obsoletos para a criança usar para stdio.

    • detached (Booleano) A criança será um líder do grupo de processo.

    • uid (Número) Define a identidade do usuário do processo.

    • gid (Número) Define a identidade do grupo do processo.

O método spawn () retorna streams (stdout & stderr) e deve ser usado quando o processo retorna uma quantidade de volume de dados. spawn () começa a receber a resposta assim que o processo começa a ser executado.

Exemplo

Crie dois arquivos js chamados support.js e master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i = 0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });

   workerProcess.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

Agora execute o master.js para ver o resultado -

$ node master.js

Verifique a saída. O servidor começou

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

Método fork ()

O método child_process.fork é um caso especial de spawn () para criar processos Node. Possui a seguinte assinatura -

child_process.fork(modulePath[, args][, options])

Parâmetros

Aqui está a descrição dos parâmetros usados ​​-

  • modulePath (String) O módulo a ser executado no filho.

  • args (Array) Lista de argumentos de string

  • options (Objeto) pode compreender uma ou mais das seguintes opções -

    • cwd (String) Diretório de trabalho atual do processo filho.

    • env (Objeto) Pares de valores-chave do ambiente.

    • execPath (String) Executável usado para criar o processo filho.

    • execArgv (Array) Lista de argumentos de string passados ​​para o executável (Padrão: process.execArgv).

    • silent (Booleano) Se verdadeiro, stdin, stdout e stderr do filho serão canalizados para o pai, caso contrário, serão herdados do pai, consulte as opções "canalizar" e "herdar" para stdio de spawn () para mais detalhes (o padrão é falso).

    • uid (Número) Define a identidade do usuário do processo.

    • gid (Número) Define a identidade do grupo do processo.

O método fork retorna um objeto com um canal de comunicação integrado, além de ter todos os métodos em uma instância normal de ChildProcess.

Exemplo

Crie dois arquivos js chamados support.js e master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var worker_process = child_process.fork("support.js", [i]);	

   worker_process.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

Agora execute o master.js para ver o resultado -

$ node master.js

Verifique a saída. O servidor foi iniciado.

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0