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