English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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)
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.
Vamos criar dois arquivos js, support.js e master.js.
console.log("Processo ") + process.argv[2] + " Executar." );
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:
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])
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.
Vamos criar dois arquivos js, support.js e master.js.
console.log("Processo ") + process.argv[2] + " Executar." );
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
child_process.fork é uma forma especial do método spawn(), usado para criar processos, com a seguinte sintaxe:
child_process.fork(modulePath[, args][, options])
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.
Vamos criar dois arquivos js, support.js e master.js.
console.log("Processo ") + process.argv[2] + " Executar." );
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