🇧🇷 child_process: spawn, fork ou exec, qual usar?
Published: 2023-11-02 21:31:10



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b7nk73cij24krnavtwr8.jpg)

## 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**

``` js
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}`);
});
```



**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.

``` js
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}`));
``` 


**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**

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

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

child.send({ hello: 'world' });
```


**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.

``` js
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'));
```



**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**

``` js
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}`);
});
```


**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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ra9rgybkxatyaajhljyn.png)

## 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/