English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NodeJS Tutorial Básico

NodeJS Express.js

NodeJS Buffer & URL;

NodeJS MySql

NodeJS MongoDB

NodeJS Arquivos (FS)

Outros NodeJS

Multiprocessos do Node.js

Todos sabemos que o Node.js opera em modo de thread única, mas usa eventos para lidar com concorrência, o que ajuda a criar múltiplos subprocessos em sistemas de cpu multi-núcleo, melhorando o desempenho.

Cada subprocesso sempre possui três objetos de fluxo: child.stdin, child.stdout e child.stderr. Eles podem compartilhar o fluxo stdio do processo pai ou também podem ser objetos de fluxo independentes.

O Node oferece o módulo child_process para criar subprocessos, com métodos como:

  • exec - child_process.exec executa o comando usando subprocesso, armazena a saída do subprocesso e retorna a saída do subprocesso como parâmetro da função de callback.

  • spawn - O child_process.spawn cria novos processos com argumentos de linha de comando especificados.

  • fork}} - child_process.fork é uma forma especial do spawn() usada para módulos executados no subprocesso, como fork('.',/son.js') é equivalente a spawn('node', ['.',/son.js') ). Diferente do método spawn, o fork cria um canal de comunicação entre o processo pai e o subprocesso, usado para comunicação entre processos.

Método exec()

child_process.exec executa o comando usando subprocesso, armazena a saída do subprocesso e retorna a saída do subprocesso como parâmetro da função de callback.

A sintaxe é como mostrado a seguir:

child_process.exec(comando[, opções], callback)

Parâmetros

Explicação dos parâmetros:

command: string, o comando que será executado, os parâmetros são separados por espaços

opções: objeto, pode ser:

  • cwd, string, o diretório de trabalho do subprocesso

  • env, objeto de variáveis de ambiente chave-valor

  • encoding, string, codificação de caracteres (padrão: 'utf)8‘)

  • shell, string, o Shell que será executado com o comando (padrão: no UNIX é/bin/sh, no Windows é cmd.exe, o Shell deve ser reconhecido -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 o cmd.exe)

  • timeout, número, tempo de espera (padrão: 0)

  • maxBuffer, número, é o maior buffer permitido em stdout ou stderr (binário), se exceder, o subprocesso será morto (padrão: 200*1024)

  • killSignal, string, sinal de encerramento (padrão: 'SIGTERM')

  • uid, número, define o ID do processo do usuário

  • gid, número, define o ID do grupo de processo

callback :Função de callback, contendo três parâmetros: error, stdout e stderr.

O método exec() retorna o maior buffer, aguarda o fim do processo e retorna o conteúdo do buffer em uma vez.

Exemplo Online

Vamos criar dois arquivos js, support.js e master.js.

Código do arquivo support.js:

console.log("Processo ") + process.argv[2] + " Executar." );

Código do arquivo master.js:

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
    var processoWorker = child_process.exec('node support.js ')+i, função, erro, stdout, stderr) {
        if (error) {}}
            console.log(error.stack);
            console.log('Código de erro: )+error.code);
            console.log('Sinal recebido: )+error.signal);
        }
        console.log('stdout: ) + stdout);
        console.log('stderr: ) + stderr);
    });
 
    workerProcess.on('exit', function(code) {
        console.log('O subprocesso já foi encerrado, código de saída ')+code);
    });
}

Executar o código acima, o resultado de saída será:

$ node master.js 
O subprocesso já foi encerrado, código de saída 0
stdout: processo 1 Executar.
stderr: 
O subprocesso já foi encerrado, código de saída 0
stdout: processo 0 executando.
stderr: 
O subprocesso já foi encerrado, código de saída 0
stdout: processo 2 Executar.
stderr:

Método spawn()

O método child_process.spawn cria um novo processo com os parâmetros de linha de comando especificados, com a seguinte sintaxe:

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

Parâmetros

Explicação dos parâmetros:

command: Comando a ser executado

args: Array Array de parâmetros de string

options Object

  • cwd String Diretório de trabalho atual do subprocesso

  • env Objeto Par de chave-valor das variáveis de ambiente

  • stdio Array|String Configuração de stdio do subprocesso

  • detached Boolean Este subprocesso se tornará o líder do grupo de processos

  • uid Número Define o ID do subprocesso do usuário

  • gid Número Define o ID do grupo de processo

O método spawn() retorna fluxos (stdout & stderr), usado quando o processo retorna uma quantidade grande de dados. O spawn() começa a receber respostas assim que o processo começa a executar.

Exemplo Online

Vamos criar dois arquivos js, support.js e master.js.

Código do arquivo support.js:

console.log("Processo ") + process.argv[2] + " Executar." );

Código do arquivo 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('O subprocesso já foi encerrado, código de saída ')+code); });}

Executar o código acima, o resultado de saída será:

$ node master.js stdout: processo 0 executando.
O subprocesso já foi encerrado, código de saída 0
stdout: processo 1 Executar.
O subprocesso já foi encerrado, código de saída 0
stdout: processo 2 Executar.
O subprocesso já foi encerrado, código de saída 0

Método fork

child_process.fork é uma forma especial do método spawn(), usado para criar processos, com a seguinte sintaxe:

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

Parâmetros

Explicação dos parâmetros:

modulePath: String, módulo que será executado no subprocesso

args: Array Array de parâmetros de string

options:Objeto

  • cwd String Diretório de trabalho atual do subprocesso

  • env Objeto Par de chave-valor das variáveis de ambiente

  • execPath String Arquivo executável para criar o subprocesso

  • execArgv Array Array de parâmetros de string do arquivo executável do subprocesso (padrão: process.execArgv)

  • silent Boolean Se true, o stdin, stdout e stderr do subprocesso serão ligados ao processo pai, caso contrário, eles herdarão do processo pai. (Padrão: false)

  • uid Número Define o ID do subprocesso do usuário

  • gid Número Define o ID do grupo de processo

O objeto retornado possui todos os métodos do exemplo ChildProcess e também um canal de comunicação integrado.

Exemplo Online

Vamos criar dois arquivos js, support.js e master.js.

Código do arquivo support.js:

console.log("Processo ") + process.argv[2] + " Executar." );

Código do arquivo 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('O subprocesso já foi encerrado, código de saída ') + code); });}

Executar o código acima, o resultado de saída será:

$ node master.js 
Processo 0 Executar.
O subprocesso já foi encerrado, código de saída 0
Processo 1 Executar.
O subprocesso já foi encerrado, código de saída 0
Processo 2 Executar.
O subprocesso já foi encerrado, código de saída 0