DEV Community

High performance school - blog
High performance school - blog

Posted on

🇧🇷 child_process: spawn, fork ou exec, qual usar?

Image description

Introdução

Uma das características valiosas do Node.js é sua capacidade de gerenciar processos filhos através de métodos como spawn, fork e exec. Embora sirvam propósitos semelhantes, há diferenças cruciais entre eles que podem impactar a eficiência e a facilidade de implementação em diferentes cenários. Este artigo visa elucidar as distinções entre spawn, fork e exec, e fornecerá exemplos práticos e casos de uso para uma compreensão aprofundada.

Spawn

Descrição

O método spawn, disponível através do módulo child_process no Node.js, é utilizado para criar processos filhos. Ele é capaz de executar qualquer comando no sistema operacional e é ideal para tarefas que demandam a execução de comandos externos.

Exemplo de Código

const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);

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

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});
Enter fullscreen mode Exit fullscreen mode

Caso de Uso: Processamento de Imagens

Em uma aplicação web, pode ser necessário converter formatos de imagem ou vídeo. Utilizando o spawn, é possível executar comandos externos para realizar estas conversões.

const { spawn } = require('child_process');
const ffmpeg = spawn('ffmpeg', ['-i', 'input.mp4', 'output.avi']);
ffmpeg.stderr.on('data', data => console.log(data.toString()));
ffmpeg.on('close', code => console.log(`Process exited with code ${code}`));
Enter fullscreen mode Exit fullscreen mode

Quando não usar

Embora o método spawn seja extremamente útil para executar comandos externos, ele não é recomendado em cenários onde:

  • A saída do comando não é relevante, pois pode consumir recursos desnecessariamente.
  • A comunicação bidirecional entre o processo principal e o filho é necessária. Neste caso, o fork seria mais apropriado.
  • Comandos simples do shell são necessários, pois exec poderia ser mais conciso.

Fork

Descrição

O método fork é uma variação especial do spawn que é utilizada para criar um novo processo Node.js. Ele facilita a comunicação entre o processo pai e o processo filho através de um canal IPC (Inter-process Communication).

Exemplo de Código

const { fork } = require('child_process');
const child = fork('child.js');

child.on('message', (msg) => {
  console.log('Message from child', msg);
});

child.send({ hello: 'world' });
Enter fullscreen mode Exit fullscreen mode

Caso de Uso: APIs de Longa Execução

Em cenários onde há APIs que levam muito tempo para serem processadas, pode-se utilizar o fork para processar essas requisições em um processo separado, mantendo o servidor principal livre para atender outras requisições.

const { fork } = require('child_process');
const app = require('express')();

app.post('/long-running-api', (req, res) => {
  const process = fork('longRunningApi.js');
  process.send(req.body);
  process.on('message', result => res.send(result));
});

app.listen(3000, () => console.log('Server is running on port 3000'));
Enter fullscreen mode Exit fullscreen mode

Quando não usar

O método fork é uma ferramenta poderosa, mas não é a melhor escolha quando:

  • A tarefa não exige um novo processo Node.js, pois pode causar sobrecarga desnecessária.
  • Não há necessidade de comunicação IPC entre os processos.
  • Se deseja executar comandos que não são específicos do Node.js. Nesse caso, spawn ou exec seria mais apropriado.

Exec

Descrição

O método exec é utilizado para executar comandos no shell. Ele é semelhante ao spawn, mas difere em que ele gera um shell e executa o comando dentro desse shell, bufferizando qualquer saída produzida.

Exemplo de Código

const { exec } = require('child_process');

exec('ls -lh /usr', (error, stdout, stderr) => {
  if (error) {
    console.error(`Error: ${error.message}`);
    return;
  }

  if (stderr) {
    console.error(`Stderr: ${stderr}`);
    return;
  }

  console.log(`Stdout: ${stdout}`);
});
Enter fullscreen mode Exit fullscreen mode

Caso de Uso: Execução de Scripts Shell

Em uma aplicação web, pode haver uma necessidade de executar scripts shell para automação ou administração do sistema. O exec facilita a execução desses scripts diretamente do código Node.js.

Quando não usar

O método exec é excelente para comandos simples do shell, mas deve ser evitado quando:

  • A saída do comando é extensa, pois ele bufferiza a saída e pode levar a problemas de memória.
  • A execução de comandos externos de longa duração é necessária, pois pode bloquear o Event Loop.
  • Precisão e controle detalhado sobre o processo filho são necessários. Neste caso, o spawn seria a melhor escolha.

Conclusão

A escolha entre spawn, fork e exec depende das necessidades específicas do projeto. O entendimento profundo desses métodos e de suas aplicações práticas permite uma programação mais eficaz e eficiente em Node.js.

Image description

Newsletter

Gostou desse conteúdo? Aproveita pra se inscrever na nossa newsletter https://highperformanceletterbr.substack.com/
Postamos conteúdos sobre performance e otimização todas as semanas!

Primeiro curso de performance backend js do brasil(ou do mundo)

🚀 Domine o Desempenho Backend com JavaScript! 🚀

🎓 Apresentamos o PRIMEIRO Curso de Performance Backend em JavaScript no Brasil! 🇧🇷

🔥 Seja um dos pioneiros a explorar o mundo do desenvolvimento backend com foco em eficiência e velocidade. Este curso exclusivo é sua porta de entrada para se tornar um especialista em otimização e desempenho de aplicações JavaScript.

🌟 O Que Oferecemos:

Instrutores Especialista: Aprenda com um profissional que atua com esse assunto no dia a dia.
Conteúdo Avançado: Desde fundamentos até técnicas avançadas de otimização.
Projetos Práticos: Coloque suas habilidades à prova com desafios reais.
Comunidade e Networking: Junte-se a uma comunidade vibrante de desenvolvedores.
🛠️ Domine Ferramentas e Técnicas Essenciais: Conteúdo prático sobre as melhores tools de monitoramento e análise de recursos

Análise de Performance;

Diagnóstico;
Otimização de Código;
Gerenciamento Eficiente de Memória;
Eventos e streaming;

🚀 Transforme a forma que os outros devs te veem:

Esteja na vanguarda do desenvolvimento backend. As habilidades que você adquirirá são inestimáveis e altamente procuradas no mercado de trabalho para posições senior.

✅ Acesse: https://highperformanceschool.hotmart.host/

Top comments (0)