¿Node.js usa un solo proceso? Child Processes
El proceso de Nodejs de un solo funciona muy bien pero eventualmente un único proceso en una CPU no será suficiente para cubrir todas las necesidades de una aplicación. Esto es independiente del tamaño de la máquina, ya que un único proceso tendrá siempre una carga limitada.
Usar multiples procesos es la mejor manera de escalar una aplicación Node.js, y precisamente una de las virtudes de Node.js es estar preparado para soportarlo.
El módulo nativo llamado child_process
te permite acceder a funcionalidad del sistema operativo ejecutando cualquier comando del sistema dentro de un proceso secundario. Podemos controlar la secuencia de entrada de un proceso secundario y escuchar la secuencia de salida.
Hay 4 maneras de crear un proceso secundario en Node.js: spawn()
, exec()
, execFile()
y fork()
. En este artículo nos centraremos en spawn()
y fork()
, ya que a mi parecer son los más útiles y usados.
Spawn
La función spawn() te permite lanzar comando del Sistema Operativo en un proceso secundario. Ejemplo:
const { spawn } = require('child_process'); const ls = spawn('ls', ['la']);
Los procesos secundarios heredan de EventEmitter y por lo tanto permite escuchar los siguientes eventos:
error
: Es emitido cuando se produce un error.close
: Es emitido cuando finaliza el proceso.message
: Es muy importante porque se emite cuando el proceso secundario invoca el métodosend()
. Esta es la forma de comunicarse con el proceso principal.
Adicionalmente, se pueden usar los 3 estandar de stdio
:
child.stdin('data', () => {});
child.stdout('data', () => {});
child.stderr('data', () => {});
Fork
El método fork()
te permite ejecutar el forma sencilla procesos de Node.js en paralelo.
La principal diferencia con spawn()
es que se establece un canal de comunicación para el proceso secundario, por lo que se puede utilizar el método send()
para compartir información entre principal y secundario.