Latest web development tutorials

Node.js multiproceso

Todos sabemos que Node.js es el modo de un solo subproceso, pero se usa para manejar concurrente orientada a eventos, lo que nos ayudará a crear múltiples subprocesos en el sistema de la CPU multi-core, lo que mejora el rendimiento.

Cada niño es siempre con tres objetos de flujo: child.stdin, child.stdout y child.stderr. Pueden compartir el proceso primario corriente stdio, o también se puede dirigir objeto de flujo independiente.

Nodo proporciona módulos child_process para crear un proceso hijo, por:

  • exec - child_process.exec proceso hijo utilización Ejecutar, el búfer de salida proceso hijo, y la salida del proceso hijo se devuelve en forma de una función de devolución de parámetros.

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

  • tenedor - child_process.fork se desovar () forma especial para el módulo que se ejecuta en el niño, como tenedor ( './ son.js') corresponde a desovar ( "nodo", [ ' ./son.js' ]).La diferencia es el método de desove, tenedor en el proceso entre padres e hijos, a establecer un conducto de comunicación para la comunicación entre procesos.


método exec ()

Ejecutar proceso hijo utilización child_process.exec, el búfer de salida proceso hijo, y la salida del proceso hijo se devuelve en forma de una función de devolución de parámetros.

La sintaxis es la siguiente:

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

parámetros

Los parámetros son como sigue:

command: String, el comando a ejecutar, los parámetros separados por espacios

Opciones: Los objetos pueden ser:

  • La corriente de trabajo actual directorio de trabajo, secuencia, el proceso hijo
  • env, el objeto de las variables ambientales clave
  • codificación, la secuencia, la codificación de caracteres (por defecto: 'UTF-8')
  • cáscara, cuerda, para ejecutar el comando Shell (por defecto: en UNIX es /bin/sh , como en Windows cmd.exe , Shell debe ser capaz de identificar el -c interruptor en UNIX o /s /c de Windows. en Windows, la línea de comandos de análisis de la compatibilidad de cmd.exe )
  • tiempo de espera, digital, tiempo de espera (por defecto: 0)
  • maxBuffer, digital, la memoria intermedia máxima en stdout o stderr se permite la existencia (binario), por lo que si el niño va a ser matado allá (por defecto: 200 * 1024)
  • killSignal, señal de fin de cadena (por defecto: 'SIGTERM')
  • UID, digitales, establezca el ID de usuario del proceso
  • gid,, establezca grupo de proceso digital de Identificación

devolución de llamada: llamada de retorno tiene tres argumentos de error, stdout y stderr.

exec () devuelve el máximo del búfer, y esperar el final del proceso, una sola vez devolver el contenido de la memoria intermedia.

Ejemplos

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

código del archivo support.js:

console.log("进程 " + process.argv[2] + " 执行。" );

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.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('子进程已退出,退出码 '+code);
   });
}

Aplicación del código anterior, la salida es:

$ node master.js 
子进程已退出,退出码 0
stdout: 进程 1 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 0 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 2 执行。

stderr: 

desove método ()

child_process.spawn utilizando los parámetros de línea de comandos especificados para crear un nuevo proceso, la sintaxis es la siguiente:

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

parámetros

Los parámetros son como sigue:

comando: el comando para ejecutar

args: array parámetro de cadena de matriz

opciones de objetos

  • directorio de trabajo actual Cwd cadena del proceso hijo
  • Objeto de entorno env pares de clave y valor variable
  • Matriz stdio | subproceso stdio Configuración de la secuencia
  • Boole individual Este niño llegará a ser un líder de grupo de procesos
  • Número de fluido para establecer el ID de usuario del proceso
  • gid grupo de procesos número de ID

método de freza () devuelve la corriente (stdout y stderr), que se utiliza en el proceso para devolver grandes cantidades de datos. Una vez que el proceso se inició cuando el desove () comenzó a recibir una respuesta.

Ejemplos

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

código del archivo support.js:

console.log("进程 " + process.argv[2] + " 执行。" );

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('子进程已退出,退出码 '+code);
   });
}

Aplicación del código anterior, la salida es:

$ node master.js stdout: 进程 0 执行。

子进程已退出,退出码 0
stdout: 进程 1 执行。

子进程已退出,退出码 0
stdout: 进程 2 执行。

子进程已退出,退出码 0

método tenedor

child_process.fork es una forma especial de método para crear procesos de desove (), la sintaxis es la siguiente:

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

parámetros

Los parámetros son como sigue:

ModulePath: Cadena, que se ejecutará en un módulo de proceso hijo

args: array parámetro de cadena de matriz

Opciones: Objeto

  • directorio de trabajo actual Cwd cadena del proceso hijo
  • Objeto de entorno env pares de clave y valor variable
  • execPath Cadena crear un proceso hijo del archivo ejecutable
  • archivo ejecutable (por defecto: process.execArgv) matriz de parámetros cadena execArgv matriz del niño
  • Si booleana en silencio true , del niño stdin , stdout y stderr se vinculará al proceso padre, de lo contrario, serán heredados del proceso padre. (Por defecto: false )
  • Número de fluido para establecer el ID de usuario del proceso
  • gid grupo de procesos número de ID

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

h3> Ejemplos

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

código del archivo support.js:

console.log("进程 " + process.argv[2] + " 执行。" );

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('子进程已退出,退出码 ' + code);
   });
}

Aplicación del código anterior, la salida es:

$ node master.js 
进程 0 执行。
子进程已退出,退出码 0
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0