English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NodeJS tutorial básico

NodeJS Express.js

NodeJS buffer & URL;

NodeJS MySql

NodeJS MongoDB

NodeJS archivos (FS)

Otras características de NodeJS

Procesos múltiples de Node.js

Todos sabemos que Node.js se ejecuta en modo de un solo hilo, pero utiliza un mecanismo de eventos para manejar la concurrencia, lo que nos ayuda a crear múltiples procesos secundarios en sistemas con cpu de múltiples núcleos, mejorando así el rendimiento.

Cada proceso secundario siempre tiene tres objetos de flujo: child.stdin, child.stdout y child.stderr. Pueden compartir los flujos stdio del proceso padre, o también pueden ser objetos de flujo independientes que se derivan.

Node proporciona el módulo child_process para crear procesos secundarios, y los métodos disponibles son:

  • exec - child_process.exec ejecuta un comando usando un subproceso, almacena la salida del subproceso y devuelve la salida del subproceso en la forma de parámetros de la función de devolución de llamada.

  • spawn - child_process.spawn crea un nuevo proceso utilizando los parámetros de línea de comandos especificados.

  • fork}} - child_process.fork es una forma especial de spawn() utilizada para ejecutar módulos en subprocesos, como fork('.',/son.js')) equivalente a spawn('node', ['.',/son.js'))). Diferente al método spawn, fork crea un canal de comunicación entre el proceso padre y el hijo, utilizado para la comunicación entre procesos.

Método exec()

child_process.exec ejecuta un comando usando un subproceso, almacena la salida del subproceso y devuelve la salida del subproceso en la forma de parámetros de la función de devolución de llamada.

La sintaxis es como se muestra a continuación:

child_process.exec(command[, opciones], callback)

Parámetros

Descripción de los parámetros como se muestra a continuación:

command: cadena, comando que se ejecutará, los parámetros se separan por espacios

opciones : objeto, puede ser:

  • cwd, cadena, directorio de trabajo del subproceso

  • env, objeto de variables de entorno clave-valor

  • encoding, cadena, codificación de caracteres (por defecto: 'utf8'])

  • shell, cadena, Shell que se ejecutará el comando (por defecto: en UNIX es/bin/sh, en Windows es cmd.exe, el Shell debe poder reconocer -la opción 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, tiempo de espera (por defecto: 0)

  • maxBuffer, número, el buffer máximo permitido en stdout o stderr (binario), si se supera, el subproceso será matado (por defecto: 200*1024)

  • killSignal, cadena, señal de finalización (por defecto: 'SIGTERM')

  • uid, número, establece el ID del proceso del usuario

  • gid, número, establece el ID del grupo de procesos

callback :La función de devolución de llamada, contiene tres parámetros error, stdout y stderr.

El método exec() devuelve el buffer más grande, espera que el proceso termine y devuelve el contenido del buffer de una vez.

Ejemplo en línea

Vamos a crear dos archivos js, support.js y master.js.

Código del archivo support.js:

console.log("Proceso ") + process.argv[2] + "Ejecutar." );

Código del archivo master.js:

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
    var procesoWorker = child_process.exec('node support.js ')+i, función, (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('El subproceso ha salido, código de salida ')+code);
    });
}

Ejecutar el código siguiente, el resultado de salida es:

$ node master.js 
El subproceso ha salido, código de salida 0
stdout: proceso 1 Ejecutar.
stderr: 
El subproceso ha salido, código de salida 0
stdout: proceso 0 ejecutándose.
stderr: 
El subproceso ha salido, código de salida 0
stdout: proceso 2 Ejecutar.
stderr:

Método spawn()

child_process.spawn crea un nuevo proceso con los argumentos de línea de comandos especificados, con el siguiente formato de sintaxis:

child_process.spawn(command[, args][, options])

Parámetros

Descripción de los parámetros como se muestra a continuación:

command: comando a ejecutar

args: Array array de parámetros de cadena

options Object

  • cwd String el directorio de trabajo del subproceso

  • env Objeto el par de valores clave de las variables de entorno

  • stdio Array|String configuración de stdio del subproceso

  • detached Boolean el subproceso se convertirá en el líder del grupo de procesos

  • uid Número configurar el ID del proceso de usuario

  • gid Número configurar el ID del grupo de procesos

El método spawn() devuelve flujos (stdout & stderr), utilizados cuando el proceso devuelve una gran cantidad de datos. spawn() comienza a recibir respuestas una vez que el proceso comienza a ejecutarse.

Ejemplo en línea

Vamos a crear dos archivos js, support.js y master.js.

Código del archivo support.js:

console.log("Proceso ") + process.argv[2] + "Ejecutar." );

Código del archivo 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('El subproceso ha salido, código de salida ')+code);   });}

Ejecutar el código siguiente, el resultado de salida es:

$ node master.js stdout: proceso 0 ejecutándose.
El subproceso ha salido, código de salida 0
stdout: proceso 1 Ejecutar.
El subproceso ha salido, código de salida 0
stdout: proceso 2 Ejecutar.
El subproceso ha salido, código de salida 0

Método fork

child_process.fork es una forma especial de spawn(), utilizada para crear procesos, con el siguiente formato de sintaxis:

child_process.fork(modulePath[, args][, options])

Parámetros

Descripción de los parámetros como se muestra a continuación:

modulePath: String, el módulo que se ejecutará en el subproceso

args: Array el array de parámetros de cadena

options:Objeto

  • cwd String el directorio de trabajo del subproceso

  • env Objeto el par de valores clave de las variables de entorno

  • execPath String el archivo ejecutable para crear el subproceso

  • execArgv Array el array de parámetros de cadena del archivo ejecutable del subproceso (Predeterminado: process.execArgv)

  • silent Boolean si es verdadero, el stdin, stdout y stderr del subproceso se asociarán con el proceso padre, de lo contrario, heredarán de él del proceso padre. (Predeterminado: false)

  • uid Número configurar el ID del proceso de usuario

  • gid Número configurar el ID del grupo de procesos

El objeto devuelto además de poseer todos los métodos del ejemplo ChildProcess, tiene un canal de comunicación integrado.

Ejemplo en línea

Vamos a crear dos archivos js, support.js y master.js.

Código del archivo support.js:

console.log("Proceso ") + process.argv[2] + "Ejecutar." );

Código del archivo 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('El subproceso ha salido, código de salida ') + code);   });}

Ejecutar el código siguiente, el resultado de salida es:

$ node master.js 
Proceso 0 ejecutar.
El subproceso ha salido, código de salida 0
Proceso 1 Ejecutar.
El subproceso ha salido, código de salida 0
Proceso 2 Ejecutar.
El subproceso ha salido, código de salida 0