Node.js: aplicación de escala
Node.js se ejecuta en modo de un solo hilo, pero usa un paradigma controlado por eventos para manejar la concurrencia. También facilita la creación de procesos secundarios para aprovechar el procesamiento paralelo en sistemas basados en CPU de varios núcleos.
Los procesos secundarios siempre tienen tres flujos child.stdin, child.stdouty child.stderr que se puede compartir con los flujos stdio del proceso principal.
El nodo proporciona child_process módulo que tiene las siguientes tres formas principales de crear un proceso hijo.
exec - El método child_process.exec ejecuta un comando en un shell / consola y almacena la salida en búfer.
spawn - child_process.spawn lanza un nuevo proceso con un comando dado.
fork - El método child_process.fork es un caso especial de spawn () para crear procesos secundarios.
El método exec ()
El método child_process.exec ejecuta un comando en un shell y almacena en búfer la salida. Tiene la siguiente firma:
child_process.exec(command[, options], callback)
Parámetros
Aquí está la descripción de los parámetros utilizados:
command (Cadena) El comando para ejecutar, con argumentos separados por espacios
options (Objeto) puede comprender una o más de las siguientes opciones:
cwd (Cadena) Directorio de trabajo actual del proceso hijo
env (Objeto) Pares clave-valor del entorno
encoding (Cadena) (Predeterminado: 'utf8')
shell (Cadena) Shell para ejecutar el comando con (Predeterminado: '/ bin / sh' en UNIX, 'cmd.exe' en Windows, El shell debe entender el interruptor -c en UNIX o / s / c en Windows. En Windows, el análisis de la línea de comandos debe ser compatible con cmd.exe.)
timeout (Número) (predeterminado: 0)
maxBuffer (Número) (predeterminado: 200 * 1024)
killSignal (Cadena) (Predeterminado: 'SIGTERM')
uid (Número) Establece la identidad de usuario del proceso.
gid (Número) Establece la identidad de grupo del proceso.
callback La función obtiene tres argumentos error, stdout, y stderr que se llaman con la salida cuando termina el proceso.
El método exec () devuelve un búfer con un tamaño máximo y espera a que finalice el proceso e intenta devolver todos los datos almacenados en búfer a la vez.
Ejemplo
Creemos dos archivos js llamados support.js y master.js -
File: support.js
console.log("Child Process " + process.argv[2] + " executed." );
File: master.js
const fs = require('fs');
const child_process = require('child_process');
for(var i=0; i<3; i++) {
var workerProcess = child_process.exec('node support.js '+i,function
(error, stdout, stderr) {
if (error) {
console.log(error.stack);
console.log('Error code: '+error.code);
console.log('Signal received: '+error.signal);
}
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
});
workerProcess.on('exit', function (code) {
console.log('Child process exited with exit code '+code);
});
}
Ahora ejecute master.js para ver el resultado:
$ node master.js
Verifique la salida. El servidor se ha iniciado.
Child process exited with exit code 0
stdout: Child Process 1 executed.
stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.
stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.
El método spawn ()
El método child_process.spawn lanza un nuevo proceso con un comando dado. Tiene la siguiente firma:
child_process.spawn(command[, args][, options])
Parámetros
Aquí está la descripción de los parámetros utilizados:
command (Cadena) El comando para ejecutar
args (Matriz) Lista de argumentos de cadena
options (Objeto) puede comprender una o más de las siguientes opciones:
cwd (Cadena) Directorio de trabajo actual del proceso hijo.
env (Objeto) Pares clave-valor del entorno.
stdio (Matriz) Configuración de stdio de String Child.
customFds (Matriz) Descriptores de archivo obsoletos para que el niño los use para stdio.
detached (Booleano) El niño será un líder de grupo de proceso.
uid (Número) Establece la identidad de usuario del proceso.
gid (Número) Establece la identidad de grupo del proceso.
El método spawn () devuelve flujos (stdout y stderr) y debe usarse cuando el proceso devuelve una gran cantidad de datos. spawn () comienza a recibir la respuesta tan pronto como el proceso comienza a ejecutarse.
Ejemplo
Cree dos archivos js llamados support.js y master.js -
File: support.js
console.log("Child Process " + process.argv[2] + " executed." );
File: 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('child process exited with code ' + code);
});
}
Ahora ejecute master.js para ver el resultado:
$ node master.js
Verifique la salida. El servidor ha comenzado
stdout: Child Process 0 executed.
child process exited with code 0
stdout: Child Process 1 executed.
stdout: Child Process 2 executed.
child process exited with code 0
child process exited with code 0
El método fork ()
El método child_process.fork es un caso especial de spawn () para crear procesos de nodo. Tiene la siguiente firma:
child_process.fork(modulePath[, args][, options])
Parámetros
Aquí está la descripción de los parámetros utilizados:
modulePath (Cadena) El módulo que se ejecutará en el niño.
args (Matriz) Lista de argumentos de cadena
options (Objeto) puede comprender una o más de las siguientes opciones:
cwd (Cadena) Directorio de trabajo actual del proceso hijo.
env (Objeto) Pares clave-valor del entorno.
execPath (Cadena) Ejecutable utilizado para crear el proceso hijo.
execArgv (Matriz) Lista de argumentos de cadena pasados al ejecutable (predeterminado: process.execArgv).
silent (Booleano) Si es verdadero, stdin, stdout y stderr del hijo se enviarán al padre, de lo contrario se heredarán del padre, consulte las opciones "pipe" y "heredar" para el stdio de spawn () para obtener más información. detalles (el valor predeterminado es falso).
uid (Número) Establece la identidad de usuario del proceso.
gid (Número) Establece la identidad de grupo del proceso.
El método fork devuelve un objeto con un canal de comunicación integrado además de tener todos los métodos en una instancia ChildProcess normal.
Ejemplo
Cree dos archivos js llamados support.js y master.js -
File: support.js
console.log("Child Process " + process.argv[2] + " executed." );
File: 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('child process exited with code ' + code);
});
}
Ahora ejecute master.js para ver el resultado:
$ node master.js
Verifique la salida. El servidor se ha iniciado.
Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0